这是我在其它论坛上看到的一道面试,由于没有放出答案.虽然没有什么难度,但自认为有点意思,就花了半个小时做了一下. 可能不是很符合要求,最小内存的情况我几乎没有考虑. 其实是自己认为没有必要对于字符串转换想办法减少内存,把过程搞得太复杂,即使是处理串有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

效果演示及本文源码和编译文件