这是我在其它论坛上看到的一道面试,由于没有放出答案.虽然没有什么难度,但自认为有点意思,就花了半个小时做了一下. 可能不是很符合要求,最小内存的情况我几乎没有考虑. 其实是自己认为没有必要对于字符串转换想办法减少内存,把过程搞得太复杂,即使是处理串有N大(比喻有100M以上),进行分批处理也能解决内存紧张的问题. 有更好实现的欢迎赐教
效果演示及本文源码和编译文件代码:;需要申请的最小内存:
;
;
;-----------------------------题 目-----------------------------------------
;请编写一个算法实现从源字符串到目标字符串的转换(“□”代表空格):
;源字符串:HE□IS□A□GOOD□BOY
;目标字符串:BOY□GOOD□A□IS□HE
;要求在最小内存情况下实现并给出源程序,并分析算法的优缺点。
;------------------------------------------------------------------------------
; This was writed by Huang Shiquan 12:20 2007-12-6
;------------------------------------------------------------------------------
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
szTestText db 'HE IS A GOOD BOY',0
MsgBoxCaption db "题目解答"
.code
Start:
mov ecx, 2
@@:
push ecx
push MB_OK
push offset MsgBoxCaption
push offset szTestText
push NULL
call MessageBox ;分两次现实处理前后的效果
pop ecx
jcxz @f
push offset szTestText
call SwapString
loop @b
@@:
ret
;---------------------------------------------------------------------------
SwapString proc lpString:dword
pushad
mov edi, lpString
push edi
xor eax, eax
mov ebx, eax
mov ecx, eax
dec ecx
push ecx
cld
repne scasb
pop eax
xchg eax, ecx
sub ecx, eax ;计算字符数
pop edi
mov esi, ecx
mov al, 20h
@@:
inc ebx
push edi
mov edx, ecx
repne scasb
sub edx, ecx
push edx
test ecx, ecx ;将各块信息入栈保存
jne @b
mov byte ptr [edi-1], 20h ;修正尾块
push esi
push 0
call LocalAlloc ;申请临时空间并写入倒序后的字符块
mov edi, eax
mov edx, esi
@@:
dec ebx
pop ecx
pop esi
rep movsb
test ebx, ebx
jne @b
mov esi, eax
mov edi, lpString
mov ecx, edx
rep movsb ;回写原地址空间
mov byte ptr [edi-1], 0 ;修正尾块
push eax
call LocalFree ;释放临时空间
popad
ret
SwapString endp
end Start