字符串循环右移-c语言
一个长度为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=; i<len; i++) {
printf("%c",str[i]);
}
printf("\n");
}
print_str
思路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=; 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 ;
} tmp = (char *)malloc(len);
if (tmp == NULL) {
return ;
} memcpy(tmp, str+len-n, n);
memcpy(tmp+n, str, len-n);
memcpy(str, tmp, len);
free(tmp);
str[len] = '\0';
return ;
} void str_rshift_1_test()
{
char str[] = "abcdefg";
str_rshift_1(str, );
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 ;
} str_reverse(str, , len-n-);
str_reverse(str, len-n, len-);
str_reverse(str, , len-);
return ;
} void str_rshift_2_test()
{ char str[] = "abcdefg";
str_rshift_2(str, );
print_str(str);
} void main()
{
str_rshift_2_test(); }
字符串循环右移-c语言的更多相关文章
- 字符串循环右移N位
给一个长度为n的字符串,把这个字符串循环右移N位(0<N<n),要求只用O(1)的额外空间和O(N)时间,有些什么方法 一开始想到的是先保存temp=s[0],在左起第N个移到s[0]的位 ...
- 用C语言实现循环左移和循环右移
有天重建一段代码时,遇到了循环右移指令,不知道用C语言怎么实现,后来得到小伟指点,感谢.. me 15:56:38004BD2C9 8B55 F8 MOV EDX,DWORD PTR SS:[EBP- ...
- PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌
-自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...
- PAT 1008. 数组元素循环右移问题 (20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 ...
- 线性表(一)——数组循环右移算法
源码:rshift.cpp #include "stdafx.h" #include <stdio.h> /****************************** ...
- PAT乙级 1008. 数组元素循环右移问题 (20)
1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允 ...
- PAT (Basic Level) Practise:1008. 数组元素循环右移问题
[题目连接] 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… A ...
- PAT乙级真题1008. 数组元素循环右移问题 (20)
原题: 1008. 数组元素循环右移问题 (20) 时间限制400 ms内存限制65536 kB 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M&g ...
- PAT-乙级-1008. 数组元素循环右移问题 (20)
1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允 ...
随机推荐
- eclipse新建安卓项目helloworld
第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK (下载Android SDK Manager工具, ...
- js操作创建和操作外部样式的例子
兼容IE8及以上的IE浏览器1. [代码][HTML]代码 <!DOCTYPE html><html lang="en"> <head> ...
- [原创]Java生成Word文档
在开发文档系统或办公系统的过程中,有时候我们需要导出word文档.在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享. 生成word文件与我们编辑word文档本质上 ...
- [Selenium] common functions comparison
1.Wait for element in default time or self defined time When the element need some time to be prese ...
- SQLite学习手册(开篇)
一.简介: SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB.MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征 ...
- ASP.NET Core:template
ylbtech-ASP.NET Core: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://yl ...
- 【旧文章搬运】Windows句柄表分配算法分析(二)
原文发表于百度空间,2009-03-30========================================================================== 四.句柄表 ...
- Hackerrank: Week of Code 36
Cut a Strip 题目简述:给定$n \times m$的矩阵$a[][]$,要求选择一个$x \times 1(1 \leq x \leq k)$的(连续)子矩阵并清零后,找到最大和的(连续) ...
- centos7安装xtrabackup
1.安装percona依赖库: yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-re ...
- java形式参数分别是基本类型和引用类型的调用
什么是形式参数,基本类型,引用类型? 形式参数(形参)百度百科里的解释是:在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数. 通俗的说就是:形式参数是指在函数名后面的小括号里 ...