您的位置:首页 > 其它

.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA

2016-12-11 16:17 696 查看
1.实现一个函数,可以左旋字符串中的k个字符。

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

方法一:

算法思想:用移的步数作为while循环条件(每移1位完了减1),1位1位的移动,即只需要一个空的变量来存移出去的字符,而这时变量i已经到了数组最后的空位置,此时把先前移

出去的字符再补回来即可

注意:

(1)for循环的判断条件是len-1,是因为把i+1赋值给i,而数组元素从0开始占了一位,所以意思是i的有效位是len-2,所以小于len-1刚好

(2)当移动的步数超过字符串长度时,为避免做无用功使用步数%字符串长度的方法来避免

#include <stdio.h>
char move_steps(char *msg ,int steps)
{
int i=0;
int len=strlen(msg);
steps=steps%len; //保证移动的位数在字符串长度范围内
while(steps)
{
char tmp=msg[0];
for(i=0;i<len-1;i++)
{
msg[i]=msg[i+1]; //每个元素向前挪动位
}
msg[i]=tmp; //这时,i已经加到最后一个空出来的位置,则将开始保存的那个元素再赋值给这个空出来的位置
steps--;
}
//return msg;
}
int main()
{
char msg[]="abcde123";
move_steps(msg ,9);
printf("%s",msg);
return 0;
}方法二:
算法思想:以移动的步数为界限,左边字符串整体逆置,右边字符串整体逆置,再整个字符串整体逆置,即需要调用3次整体逆置字符串函数,要注意各个逆置区间的定义

#include <stdio.h>
char reverse_string(char *start, char *end) //以两个指针指向位区间,进行整体字符串逆置
{
while(start<end)
{
*start=*start^*end;
*end=*start^*end;
*start=*start^*end;
start++;
end--;
}
}
int main()
{
char msg[]="abcde123";
int steps=25;
int len=strlen(msg); //当移动步数大于字符串长度时,避免做出多余的移动
steps=steps%len;
reverse_string(msg, msg+steps-1); //前半部分逆置
reverse_string(msg+steps, msg+len-1); //后半部分逆置
reverse_string(msg, msg+len-1); //整体再逆置
printf("%s",msg);
return 0;
}方法三:
算法思想:(相当于穷举法)申请一个是原来2倍+1(算上\0)的数组空间,将原来的字符串复制一遍存在这个空间里,然后从原来的首元素加上移动的步数开始输出len个长度的字

符串,完成左旋效果(先后用到strcpy strcat strncpy函数)

注意:

(1)变量定义一定要放在表达式前面,否则乱报错;

a6d3
(2)用malloc函数申请完空间记得释放,头文件<stdlib.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse_string(char *msg, int steps)
{
int len=strlen(msg);
//steps=steps%len;
char *tmp=(char*)malloc(2*len+1); //申请2倍的原数组空间
steps=steps%len;
strcpy(tmp,msg); //把原来的字符串拷贝到这个大空间里
strcat(tmp,msg); //把原来的字符串再拼接到后面(复制2遍)
strncpy(msg,msg+steps,len); //从要移动的位数后一位起,获取原来长度的字符串,达到左旋效果
free(tmp);

}
int main()
{
char msg[]="abcde123";
reverse_string(msg, 2);
printf("%s",msg);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐