字符串循环右移c实现
来源:互联网 发布:js 冻结对象 编辑:程序博客网 时间:2024/06/03 16:40
一个长度为len的字符串,对其循环右移n位
[期望]
char str[] = "abcdefg";
右移3次后,变成"efgabcd"
[思路]
思路1.
如果用每移动一次,就要把整个字符串整体移动一次的方法,显得太费劲了。
我们可以用空间换时间,通过内存拷贝来实现。
需要新申请一块相同大小的内存,把原字符串的后n个字节拷贝到它的开始地址,把原字符串的前(len-n)个字节拷贝到它的(开始地址+n)处。
为便于查看结果,我们先定义一个打印字符串的函数void print_str(char *str);
void print_str(char *str){ int i,len; if (str == NULL) { return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf("\n");}
思路1的代码实现:
#include <stdio.h>#include <string.h>#include <stdlib.h>void print_str(char *str){ int i,len; if (str == NULL) { return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf("\n");}int str_rshift_1(char *str, int n){ int len; char *tmp; len = strlen(str); if (len < n) { return 1; } tmp = (char *)malloc(len); if (tmp == NULL) { return 1; } memcpy(tmp, str+len-n, n); memcpy(tmp+n, str, len-n); memcpy(str, tmp, len); free(tmp); str[len] = '\0'; return 0;}void str_rshift_1_test(){ char str[] = "abcdefg"; str_rshift_1(str, 3); print_str(str);}void main(){ str_rshift_1_test();}
思路2.
来自《编程珠玑》里的算法,利用字符串的逆序来实现。
比如字符串"abcdefg",要循环右移3位,那么这个字符串可以分为2部分:
前半部分:"abcd" 和后半部分 "efg"。
我们先把前半部分逆序变成 -> "dcba"
再把后半部分逆序变成-> "gfe"
这时整体字符串应该是 "dcbagfe"
我们再对整个字符串逆序一遍,结果-> "efgabcd"。
bingo,循环右移完成。
总结一下,总共要进行3次逆序:前半部分逆序,后半部分逆序,整体逆序。
逆序用到的函数原型是void str_reverse(char *str, int left, int right);它的实现在这里。
思路2的代码实现:
int str_rshift_2(char *str, int n){ int len = strlen(str); if (len < n) { return 1; } str_reverse(str, 0, len-n-1); str_reverse(str, len-n, len-1); str_reverse(str, 0, len-1); return 0;}void str_rshift_2_test(){ char str[] = "abcdefg"; str_rshift_2(str, 3); print_str(str);}void main(){ str_rshift_2_test(); }
阅读全文
0 0
- 字符串循环右移c实现
- 实现字符串右移循环
- C实现循环右移
- C语言 字符串循环右移
- 实现对字符串进行循环右移
- 编程实现字符串的循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- 字符串循环右移
- linux下mongodb的安装及启动
- 运行时runtime 知识运用
- UVA
- 随笔随想
- UGC社区敏感词过滤原理
- 字符串循环右移c实现
- Hello World
- SVN命令之清理命令(clean up)的功能及使用技巧
- HTML 表单 (form) 的作用解释
- jackson 实体转json属性为NULL或者为空不参加序列化
- c++数组首元素地址与整个数组地址,算术运算区别
- Java的StrongReference、WeakReference、SoftReference、PhantomReference的理解
- android TextView 设置Marquee无效问题,最简便的设置
- UVA