笔试面试4 字符串的循环移位算法

字符串的循环移位是指将整个字符串左移或者后移n位。

例如:ab1234左移两位就是1234ab.

这个算法的实现是利用三次反转。

仔细观察发现,左移和后移后,1234和ab的顺序是不变的。

将1234和ab看成两个整体。

左移可以通过以下变换得到。

先将ab反转,得到ba1234;

然后反转另一部分,1234,得到ba4321;

最后将整个反转,就得到了1234ab,即左移两位后的字符串。

代码实现为:(限定n的值为合法值,即n>=0&&n<strlen(str))

#include <stdio.h>
#include <conio.h>
#include <string.h>
//例如   123abc 左移两位变为 3abc12
//核心思想:将str看成两部分,12和3abc,利用三次反转完成左移
// 左移后,这两部分都是不变的。
//先将12反转,变为21;
//反转3abc,变为cba3,这时候,源字符串变为了 21cba3
//这时候,再将整个串反转,变为了3abc21,完成左移
char *rotate_left(char *str,int n){//循环左移,str为原串,n为左移位数
	 if(str==NULL)
	   	 return NULL;
	 int len=strlen(str);
	 int i;//C99 不允许在for内声明
	 for(i=0;i<n-1-i;i++){//reverse first part
	 		 str[i]=str[i]^str[n-1-i];
	 		 str[n-1-i]=str[i]^str[n-1-i];
	 		 str[i]=str[i]^str[n-1-i];
	 }
	 int j;
	 for(i=0,j=n;j<len-1-i;j++,i++){//reverse second part
	 		 str[j]=str[j]^str[len-1-i];
  			 str[len-1-i]=str[j]^str[len-1-i];
		   	 str[j]=str[j]^str[len-1-i];
	 }
	 int k;
	 for(k=0;k<len-1-k;k++){//reverse all
	 		 str[k]=str[k]^str[len-1-k];
 		  	 str[len-1-k]=str[k]^str[len-1-k];
		   	 str[k]=str[k]^str[len-1-k];
	 }

}
int main()
{
 	char str1[]="hello";//不要写成 char *str="hello",因为这样的话得到的是字符串常量
	char str2[]="thanks123";
	char str3[]="carry"; 

	printf("str1=%s\n",str1);
	rotate_left(str1,0);
	printf("rotate_left(str1,0);\n");
	printf("str1=%s\n\n",str1);	

	printf("str2=%s\n",str2);
	rotate_left(str2,3);
	printf("rotate_left(str2,3);\n");
	printf("str2=%s\n\n",str2);

	printf("str3=%s\n",str3);
	printf("rotate_left(str3,5);\n");
	rotate_left(str3,5);
	printf("str3=%s\n\n",str3);
 	 getch();

}

测试结果:

循环右移的思想是完全一样的。

#include <stdio.h>
#include <conio.h>
#include <string.h>

char *rotate_right(char *str,int n){//循环左移,str为原串,n为右移位数
	 if(str==NULL)
	   	 return NULL;
	 int len=strlen(str);
	 int i;//C99 不允许在for内声明
	 for(i=0;i<len-1-i-n;i++){//reverse first part
	 		 str[i]=str[i]^str[len-n-i-1];
	 		 str[len-n-i-1]=str[i]^str[len-n-i-1];
	 		 str[i]=str[i]^str[len-n-i-1];
	 }
	 int j;
	 for(i=0,j=len-n;j<len-1-i;j++,i++){//reverse second part
	 		 str[j]=str[j]^str[len-1-i];
  			 str[len-1-i]=str[j]^str[len-1-i];
		   	 str[j]=str[j]^str[len-1-i];
	 }
	 int k;
	 for(k=0;k<len-1-k;k++){//reverse all
	 		 str[k]=str[k]^str[len-1-k];
 		  	 str[len-1-k]=str[k]^str[len-1-k];
		   	 str[k]=str[k]^str[len-1-k];
	 }

}
int main()
{
 	char str1[]="hello";//不要写成 char *str="hello",因为这样的话得到的是字符串常量
	char str2[]="thanks123";
	char str3[]="carry"; 

	printf("str1=%s\n",str1);
	rotate_right(str1,0);
	printf("rotate_right(str1,0);\n");
	printf("str1=%s\n\n",str1);	

	printf("str2=%s\n",str2);
	rotate_right(str2,3);
	printf("rotate_right(str2,3);\n");
	printf("str2=%s\n\n",str2);

	printf("str3=%s\n",str3);
	printf("rotate_right(str3,5);\n");
	rotate_right(str3,5);
	printf("str3=%s\n\n",str3);
 	 getch();

}

测试结果:

——————————————————————————————————————————————————————————————————

//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:[email protected]

2014-11-5

于GDUT

——————————————————————————————————————————————————————————————————

时间: 2024-08-07 21:49:48

笔试面试4 字符串的循环移位算法的相关文章

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

算法之美一书附录中笔试面试题目参考答案

探秘算法世界,求索数据结构之道:汇集经典问题,畅享编程技法之趣:点拨求职热点,敲开业界名企之门.<算法之美--隐匿在数据结构背后的原理>全文目录."45个算法"目录."22个经典问题目录",请见如下链接: 算法之美隆重上市欢迎关注(更有三重好礼) http://blog.csdn.net/baimafujinji/article/details/50484348 *本书附录中的笔试面试题目主要从我之前的系列博文<常见C++笔试题目整理(含答案)&g

C++笔试面试(算法题集三)

1>    编写strcpy函数,已知函数原型char*strcpy(char* strDest,char* strSrc) ANSWER: Chat* strcpy(char* strDest,char* strSrc) { If(strSrc==NULL)  return NULL; Char*ch1=strSrc,*ch2=strDest; While(*ch1!='\0') { *ch2++=*ch1++; } *ch2='\0'; Return strDest; } 2>    用递

leetcode 刷500道题,笔试/面试稳过吗?谈一谈这些年来算法的学习

想要学习算法.应付笔试或者应付面试手撕算法题,相信大部分人都会去刷 Leetcode,有读者问?如果我在 leetcode 坚持刷它个 500 道题,以后笔试/面试稳吗? 这里我说下我的个人看法,我认为不稳.下面说说为啥不稳以及算法题应该如何刷.如何学才比较好,当然,也会推荐自己学过的资料. 一.先说说笔试题 在刷 leetcode 的时候,你会发现,每道题的题意都很短,你只需要花十几秒的时间,就知道这道题是要你干嘛了,并且每道题所用道的算法思想都很明确,动态规划.递归.二分查找等,你可能很快就

#面试系列 字符串处理算法

面试系列 字符串处理算法 最大子序列和 动态规划法 思路:顺序遍历,判断sum是否大于等于0 时间复杂度:O(n) 空间复杂度:O(1) #include <iostream> #include <limits.h> using namespace std; int getMaxSum(int *arr, int size) { int maxSum = INT_MIN; //负的无穷大 int sum = 0; int curstart = 0; int start = 0; i

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

php 笔试面试 总结

一次小小的笔试面试经历,虽然是一些简单的问题,但是自己在这儿总结一下,也查一些资料,得出一些较好的答案,也能帮助自己成长. 1.自己熟悉的http状态码及其意义 其实这个题答案随处可见.这儿也还是记录一下我们常见的http状态码 200:请求返回的状态正常. 301:url永久性重定向. 302:url暂时性重定向. 400:错误请求. 401:未授权访问. 403:禁止访问. 404:未找到 500:服务器错误. 502:bad gateway.错误网关. 504:Gateway Timeou

[转]关于Web前端开发,附:(百度web前端笔试面试题目)

关于Web前端及百度web前端笔试面试题目 随着各大互联网公司设立了Web前端开发工程师.设计工程师等职位,web前端越来越得到互联网企业的认可.而且其重视程度与地位也随着浏览器 端的富客户端的体现而日益提高. 眼前对HTML5的未来和走向,业内的预测是会和Flash.Silverlight等相结合,从而取代传统的客户端应用程序.而实现这个目标的客户端核 心工作是有Web前端工程师来完成的. 从另一个角度,对于web产品来说,交互和用户体验是产品的第一价值,这部分价值的体现就是在web前端.可以

前端面试中的常见的算法问题

虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路.下面罗列在前端面试中经常撞见的几个问题吧. Q1 判断一个单词是否是回文? 回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环.比如 mamam redivider . 很多人拿到这样的题目非常容易