将字符串循环左移右移
来源:互联网 发布:陈秋平网络大电影 编辑:程序博客网 时间:2024/04/30 00:27
#include <stdio.h> #include <stdlib.h> #include <string.h> /*********************** 最节约时间的方法 ************************/ /** * @brief 将字符串向左旋转n个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_left(char *str, int mov) { if (NULL == str || mov <= 0) return; char tmp[mov]; int i; int len = strlen(str); if (len == 0) return; mov %= len; if (mov == 0) return; for (i = 0; i < sizeof tmp; i++) tmp[i] = str[i]; tmp[i] = '\0'; for (i = 0; i < len-mov; i++) str[i] = str[i+mov]; for (; i < len; i++) str[i] = tmp[i-(len-mov)]; } /** * @brief 将字符串向右旋转n个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_right(char *str, int mov) { if (NULL == str || mov <= 0) return; char tmp[mov]; int i; int len = strlen(str); if (len == 0) return; mov %= len; if (mov == 0) return; for (i = len - mov; i < len; i++) { tmp[i-(len-mov)] = str[i]; } tmp[i-(len-mov)] = '\0'; for (i = len - 1; i >= mov; i--) { str[i] = str[i-mov]; } for (; i >= 0; i--) str[i] = tmp[i]; } /*********************** 最节约时间的方法 ************************/ /*********************** 最节约空间的方法 ************************/ /** * @brief 将字符串向左旋转1个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_one_left(char *str) { if (NULL == str) return; int len = strlen(str); int i; if (len == 0) return; char tmp = str[0]; for (i=0; i<len-1; i++) { str[i] = str[i+1]; } str[i] = tmp; } /** * @brief 将字符串向右旋转1个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_one_right(char *str) { if (NULL == str) return; int len = strlen(str); if (len == 0) return; char tmp = str[len-1]; int i; for (i=len-1; i>0; i--) { str[i] = str[i-1]; } str[i] = tmp; } /*********************** 最节约空间的方法 ************************/ /*********************** 最节约空间和时间的方法之一 ************************/ /** * @brief 返回数值i和j的最大公约数 * @return 正确返回最大公约数,参数有问题返回-1 */ int gcd(int i, int j) { if (i<=0 || j<=0) return -1; while (i != j) { if (i > j) i -= j; else j -= i; } return i; } /** * @brief 将字符串向左旋转n个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_fast_left(char *str, int mov) { if (NULL == str || mov <= 0) return; int len = strlen(str); char tmp; if (!mov) return; mov %= len; if (!mov) return; int i, j, k; int g_cd = gcd(mov, len); for (i=0; i<g_cd; i++) { tmp = str[i]; j = i; while (1) { k = j + mov; if (k >= len) k -= len; if (k == i) break; str[j] = str[k]; j = k; } str[j] = tmp; } } /** * @brief 将字符串向右旋转n个位置 * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_fast_right(char *str, int mov) { if (NULL == str || mov <= 0) return; int len = strlen(str); if (!mov) return; mov %= len; // 修移动次数 if (!mov) return; mov = len - mov; move_string_left(str, mov); } /*********************** 最节约空间和时间的方法之一 ************************/ /*********************** 最节约空间和时间的方法之二 ************************/ /** * @brief 交换字符串str中的从pos1开始和从pos2开始长度为num的两部分元素。 * 注意防止内存越界! * @param str 待交换部分字符的字符串 * @param[in] pos1 第一部分起始位置 * @param[in] pos2 第二部分起始位置 * @param[in] num 要交换的字符数量 */ void swap_string(char *str, int pos1, int pos2, int num) { char *str1 = str + pos1; char *str2 = str + pos2; int i; char tmp; for (i=0; i<num; i++) { tmp = *str1; *str1 = *str2; *str2 = tmp; str1++; str2++; } } /** * @brief 用交换元素的方法进行向左旋转(循环左移) * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_swap_left(char *str, int mov) { if (NULL == str || mov <= 0) return; int len = strlen(str); if (!mov) return; mov %= len; // 修移动次数 if (!mov) return; int i = mov; int j = len - mov; while (i != j) { if (i > j) { swap_string(str, mov-i, mov, j); i -= j; } else { swap_string(str, mov - i, mov - i + j, i); j -= i; } } swap_string(str, mov-i, mov, i); } /*********************** 最节约空间和时间的方法之二 ************************/ /*********************** 最节约空间和时间的方法之三 ************************/ /** * @brief 将字符串str中从start开始至end结束的字符进行逆转 * @param str 待逆转部分字符的字符串 * @param[in] start 开始的位置 * @param[in] end 结束的位置 * @return 无 */ void reverse(char *str, int start, int end) { char *pos1 = str + start; char *pos2 = str + end; char tmp; while (pos1 < pos2) { tmp = *pos1; *pos1 = *pos2; *pos2 = tmp; pos1++; pos2--; } } /** * @brief 利用逆转的方法对字符串进行向左旋转(循环左移) * @param str 待旋转的字符串 * @param[in] mov 需要旋转的数量 * @return 无 */ void move_string_reverse_left(char *str, int mov) { if (NULL == str || mov <= 0) return; int len = strlen(str); if (!mov) return; mov %= len; // 修移动次数 if (!mov) return; reverse(str, 0, mov-1); reverse(str, mov, len-1); reverse(str, 0, len-1); } /*********************** 最节约空间和时间的方法之三 ************************/ /** @} */ #if 1 int main(int argc, char **argv) { char str[] = "Hello World!"; int n = atoi(argv[1]); int i; move_string_reverse_left(str, n); printf("%s\n", str); return 0; } #endif
参考文章:
http://canlynet.iteye.com/blog/1095722
0 0
- 将字符串循环左移右移
- 实现将字符串右循环n位
- 将字符串循环左移n位
- 编写一个函数,将字符串循环右移n位
- 将一个字符串循环右移K位
- 将一篇文章的按单词倒序,将一个字符串向左循环移动
- 循环字符串
- 字符串,循环
- 将一个长度为n的字符串向左循环移动m位
- 将字符串放到MAP中并放到LIST中保存,并页面循环输出。
- 初步实现无循环(则递归)将任意整数转任意进制字符串
- 初步实现无循环(则递归)将任意整数转任意进制字符串
- foreach循环练习题:任意输入字符串将其转换成字符数组
- 将字符串循环左移N个位置(讯飞笔试题)
- vue.js技术知识点之-将json里面的字符串转为json对象并循环输出
- 将标签循环输出
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
- 3 响应码
- Volley框架的使用
- android异常:Consumer closed input channel or an error occurred. events
- NSTextAttachment富文本控件实现图文混排
- Manacher算法 with c++
- 将字符串循环左移右移
- PHP前端开发教程
- 《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制
- ionic状态改变时动态(强制)刷新页面
- mtl_system_items_b表中的栏位与界面栏位对应
- VC++调用并编译静态库
- 配置mysql默认编码格式 && 解决Can't connect to local MySQL server through socket 问题
- 全屏右滑手势实现
- 关于tomcat服务器无法打开文件名为中文名的页面的问题