博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串循环右移-c语言
阅读量:4513 次
发布时间:2019-06-08

本文共 1353 字,大约阅读时间需要 4 分钟。

一个长度为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
print_str

思路1的代码实现:

#include 
#include
#include
void print_str(char *str){ int i,len; if (str == NULL) { return; } len = strlen(str); for(i=0; i
View Code

思路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();    }
View Code

 

转载于:https://www.cnblogs.com/bugchecker/p/3618661.html

你可能感兴趣的文章
netdom join 错误:指定的域不存在,或无法联系。
查看>>
Android中Dialog的使用
查看>>
Android Activity接收Service发送的广播
查看>>
[Leetcode] Spiral Matrix | 把一个2D matrix用螺旋方式打印
查看>>
加速和监控国际网络
查看>>
【Flex】读取本地XML,然后XML数据转成JSON数据
查看>>
字符串循环右移-c语言
查看>>
解决从pl/sql查看oracle的number(19)类型数据为科学计数法的有关问题
查看>>
古训《增广贤文》
查看>>
职场的真相——七句话
查看>>
xcode命令行编译时:codesign命令,抛出“User interaction is not allowed.”异常 的处理...
查看>>
[转载]开机出现A disk read error occurred错误
查看>>
STM32 C++编程 002 GPIO类
查看>>
无线冲方案 MCU vs SoC
查看>>
进程装载过程分析(execve系统调用分析)
查看>>
在windows 7中禁用media sense
查看>>
ELK-Elasticsearch安装
查看>>
Android 模拟器(Emulator)访问模拟器所在主机
查看>>
删除字符串中指定子串
查看>>
day40-socket编程
查看>>