1.1字符串旋转--左移,右移x位置--三步反转
2016-06-24 14:35
375 查看
给定一个字符串,对其移动,向左或者 向右移动x位置。
这类题对于我们最初学习c语言就是一个典型题。
大概思路:
1。循环x次,每次执行一步左移或右移。时间复杂度O(m*n)。
进一步优化:
三步反转法---时间复杂度O(n)。
具体思路:
(1)。若左移3位,则将其分为X(1~3),Y(3~n)两部分。
(2)。将两部分分别反转。
(3)。 将整体反转。
例 abcdef 左移3位。
X abc Y def
X cba Y fed
XY defabc
下面代码照网上学的:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void reverse(char *left,char *right) //反转
{
while(left<right)
{
char temp=*left;
*left=*right;
*right=temp;
right--;
left++;
}
}
void Leftmove(char *s,int m) //三次反转
{
int len=strlen(s);
m%=len;
reverse(s,s+len-1);
reverse(s,s+len-m-1);
reverse(s+len-m,s+len-1);
}
int main()
{
char str[100];
gets(str);
int k;
cin>>k; // 左移k位
Leftmove(str,k);
puts(str);
}
这类题对于我们最初学习c语言就是一个典型题。
大概思路:
1。循环x次,每次执行一步左移或右移。时间复杂度O(m*n)。
进一步优化:
三步反转法---时间复杂度O(n)。
具体思路:
(1)。若左移3位,则将其分为X(1~3),Y(3~n)两部分。
(2)。将两部分分别反转。
(3)。 将整体反转。
例 abcdef 左移3位。
X abc Y def
X cba Y fed
XY defabc
下面代码照网上学的:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void reverse(char *left,char *right) //反转
{
while(left<right)
{
char temp=*left;
*left=*right;
*right=temp;
right--;
left++;
}
}
void Leftmove(char *s,int m) //三次反转
{
int len=strlen(s);
m%=len;
reverse(s,s+len-1);
reverse(s,s+len-m-1);
reverse(s+len-m,s+len-1);
}
int main()
{
char str[100];
gets(str);
int k;
cin>>k; // 左移k位
Leftmove(str,k);
puts(str);
}
相关文章推荐
- org.springframework.beans.factory.BeanNotOfRequiredTypeException
- mongoVue此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。的解决办法
- swiper的基础使用(十三)
- android-设备信息工具类
- 软件测试实习0624-testNG测试套件
- Java实验(2) Pi的近似值
- Spring整合Shiro做权限控制模块详细案例分析
- Android应用的闪退(crash)分析
- Vector和ArrayList的比较
- iOS之GIF动画文件的播放
- Qt资料大全
- Qt资料大全
- Java中long型转float型那点事
- 一些php东西
- 计时器的几种实现方式
- 简单的多线程理解
- oracle 域索引创建及维护
- 文章标题
- 更改控制面板>硬件和声音>电源选项导致cpu温度很高
- 选课网站