字符串循环右移-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)个整数,在不允 ...
随机推荐
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- 一步一步学Silverlight 2系列(16):数据与通信之JSON
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- oracle 转移表空间
一.系统表空间数据文件迁移:SQL> conn /@tmpdb as sysdba 已连接. SQL> desc dba_data_files; 名称 是否为空? 类型 --------- ...
- UVA-10600(次小生成树)
题意: 现在给一个图,问最小生成树和次小生成树的权值和是多少; 思路: 求最小生成树的两种方法,次小生成树是交换最小生成树的其中一条边得到的,现在得到了最小生成树,枚举不在次小生成树中的边,再求一边最 ...
- Ntrip通讯协议1.0
Ntrip通讯协议1.0 1 什么是Ntrip? CORS(Continuously Operating Reference Stations)就是网络基准站,通过网络收发GPS差分数据.用户访问CO ...
- SPOJ:Help BTW(二分)
BTW wants to buy a gift for her BF and plans to buy an integer array. Generally Integer arrays are c ...
- 【HDU 2089】 不要62
[题目链接] 点击打开链接 [算法] 数位DP 和上一题 : HDU3555很像 [代码] #include<bits/stdc++.h> using namespace std; #de ...
- 【NOIP 2003】 加分二叉树
[题目链接] 点击打开链接 [算法] 树形DP即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 50 in ...
- NOIP2007 矩阵取数游戏(区间DP)
传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...
- Bootstrap-CL:输入框组
ylbtech-Bootstrap-CL:输入框组 1.返回顶部 1. Bootstrap 输入框组 本章将讲解 Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组 ...