字符串右移(创发科技实习面试题)

引子:今年暑假7月份的时候,打算找个实习单位锻炼一下能力,学点儿东西,投了创发科技的实习生,让我去面试,结果当场出一道字符串右移的题目让我坐他旁边编程,我直接懵逼了。考官后来看我实在做不出来,就问我的思路,我也是糊里糊涂说了一些,但一讨论总是存在各种问题,最后也不了了之没有再问了。现在复习完了C语言的第11章,回头再重新做一下。(最终的结果是没有应聘成功,但我想主要原因是我的实习时间太短了,只有2个月,而他要求半年,当然题目没做出来也是一个重要原因吧)


 

题目:编写一个函数,要求输入一个字符串和要移动的位数n,使得该字符串能向右移动n位,输出移动后的字符串。例如:tomloveslily移动2位得lytomlovesli。


 

思路:意思就是把字符串分成两部分,交换位置,实际操作的思路是:把最后n个字符先保存起来(待会儿用),再把前strlen-n个字符往后移动n个,最后把之前保存的后n个字符放在前n个字符的位置上。注意两个问题:交换部分时需要借助第三者来暂时存储(类似于交换x,y的值需要借助第三变量);移动字符串时要从右往左挨个赋值,不能从左往右赋值(否则的话相当于改变了字符再移动)。

代码如下:

void right_move(char * str, int n)  //字符串str右移n个位置的函数
{
    int i;
    char * temp = (char *)malloc(n * sizeof(char));  //临时分配一块儿内存,大小根据要移动的位数决定
    int len = strlen(str);

    for(i=0; i<n; i++)        //给temp[]赋值为str[]的后n位
        temp[i] = str[len-n+i];

    for(i=0; i<len-n; i++)    //把字符串的前len-n位右移n位
        str[len-i-1] = str[len-i-1-n];    //每个字符右移n位

    for(i=0; i<n; i++)        //字符串前n位赋值(即原来的后n位)
        str[i] = temp[i];
}

总的代码如下:

/* 输入一个字符串,输入需要移动的位数,将字符串向右移动相应的位数 */
/* 例如:tomloveslily移动两位得lytomlovesli */

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

void right_move(char *, int);

int main(void)
{
    int n;
    char str[30];
    puts("Please enter a line of string(less than 30 chars and \"enter\" to stop):");
    gets(str);
    puts("enter the digits \"n\" you want to move:");
    scanf("%d", &n);
    puts(str);
    right_move(str, n);
    puts(str);
}

void right_move(char * str, int n)
{
    int i;
    char * temp = (char *)malloc(n * sizeof(char));
    int len = strlen(str);

    for(i=0; i<n; i++)        //给temp[]赋值为str[]的后n位
        temp[i] = str[len-n+i];

    for(i=0; i<len-n; i++)    //把字符串的前len-n位右移n位
        str[len-i-1] = str[len-i-1-n];    //字符右移n位

    for(i=0; i<n; i++)        //字符串前n位赋值(即原来的后n位)
        str[i] = temp[i];
}

总结:字符串这一章的题目还是挺有意思的,花了很多时间来对待是值得的,涉及到一些算法或者“办法”(排序、压缩、移动、交换等),挺考验人的思路的。同时这一章的内容也是面试或者笔试的常见考察内容。

 

posted @ 2016-11-04 20:35  行动救赎  阅读(465)  评论(0编辑  收藏  举报