Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87910
  • 博文数量: 44
  • 博客积分: 2525
  • 博客等级: 少校
  • 技术积分: 316
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-25 17:01
文章分类

全部博文(44)

文章存档

2010年(44)

我的朋友

分类: C/C++

2010-04-27 00:14:14

要求:
   给定一个字符串x, 位置i,把位置i后的字串搬到这个字符串的开头。比如x = abcdefg 如果i = 4,那么结果就是 efgabcd. 但要求使用递归实现,而且不用额外的空间(也就是说不能另外开个数组,因为x可能会很长这样的话很费空间)。

此为某tx的面试题,基本思路:使用两个计数器,记录将要被移动的字符的位置和已经移动好的字符个数,每次递归移动一个字符到字符串首部。 不过效率感觉很低,虽然未使用new/malloc分配额外的内存。
如果你有更好的方法,欢迎ps, :)


#include <string.h>
#include <stdio.h>

int moveString(char* pStrSrc, int pos)
{

    // overflow
    if (strlen(pStrSrc) < pos)
       return -1;


    // at the beginning or end , return
    if (pos == 0 || pos == strlen(pStrSrc))
       return 0;
       
    printf("\ns=%s------------pos=%d\n",pStrSrc, pos);
    
    static int j = 0;
    char t = pStrSrc[pos];
    for(int i=pos;i>j;i--)
        pStrSrc[i] = pStrSrc[i-1];
    pStrSrc[j++] = t;
    //j++; //move to next start

    return moveString(pStrSrc, pos+1);   
}

int main()
{
    char test[] = "test_moveString()=";
    printf("str=%s\n",test);
   
    moveString(test,5);
   
    printf("movedstr=%s\n",test);
   
    getchar();
    return 0;
}




阅读(817) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~