面试热门题:字符串左旋右旋

原创 2016年06月01日 01:34:35

面试的时候有很多这种左旋或者右旋的题目,今天我就把这个题目用不同的方式探讨一下

例题:请实现字符串右循环移位函数,比如:"abcdefg"循环右移3位就是"efgabcd";

第一种方法:三目旋转法,三目旋转法的思想就是先把字符串整个逆置,然后需要旋转几位就逆置前几个,最后逆置后面的字符


如下图所示:

代码实现:

void RightLoopMove(char *pStr, unsigned short steps)
{
 assert(pStr);
 int len = strlen(pStr);
 _reserve(pStr, pStr, pStr + len-1);//len-1是字符串pStr的最后一个不是\0字符的位置,逆置整个字符串
 _reserve(pStr, pStr, pStr + steps - 1);//逆置前面部分
 _reserve(pStr, pStr + steps, pStr + len - 1);//逆置后面部分
 printf("%s\n", pStr);

}

void _reserve(char *str, char *left, char *right)
{
 assert(str);//用assert断言,以免出错
 assert(left);
 assert(right);

 while (left < right)//循环终止的条件是左边小于右边
 {
  char tmp = 0;
  tmp = *left;
  *left = *right;
  *right = tmp;
  left++;
  right--;
 }

}

第二种方法是暴力强转法,

暴力强转法是指先把最后的非‘’\0‘’的字符保存到临时变量tmp里,然后从后往前把字符一个一个往后一个位置上移动,最后将tmp保存到第一个字符的位置上,循环需要旋转的字符个数,就可以得到旋转好的字符串了

具体步骤如下图所示:

代码实现:

void RightLoopMove(char *pStr, unsigned short steps)
{
	assert(pStr);
	int len = strlen(pStr);
	int i = len - 1;
	while (steps--)
	{
		char tmp = *(pStr + len - 1);

		for (int i = len - 1; i >= 0; i--)
		{
			pStr[i] = pStr[i - 1];
		}
		pStr[0] = tmp;
	}
	printf("%s\n", pStr);
}
好了,今天的分享就这些了,如果还有别的方法欢迎一起学习,如果有什么错误也希望大家能够指出,一起学习哦!









版权声明:本文为博主原创文章,转载需注明出处

微软面试之 26 左旋右旋字符串

.转载自:July  http://blog.csdn.net/v_JULY_v/article/details/6126406 26.左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面...

字符串左旋右旋--程序员面试宝典

一.左旋 解1 void left_move(char* msg, int len, int steps) { assert(msg); assert(len); steps = steps%l...

剑指offer之字符串左旋右旋问题

右旋 关于思路: 1.右旋就是把字符串的前几个字符放到字符串的后面,首先,可以根据要旋转的数量,把字符串分成两部分。 2.第一部分进行翻转,第二部分进行翻转。 3.整体翻转 例如:abcde...
  • yaszja
  • yaszja
  • 2017年08月08日 20:26
  • 105

字符串左旋右旋——三步旋转法和移相法

字符串左旋右旋——三步旋转法和移相法!(K个字符)

平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作

/** * 类说明:AVL树 */ public class AVLTreeE extends ComparableE>> { NodeE> root; int size = ...

树(二叉树、红黑树及左旋右旋等调整操作)

树(二叉树、红黑树及左旋右旋等调整操作)      在分析Java集合类源码的时候涉及到了树的知识,发现树结构要比数组和链表等要复杂的多,所以巩固和补充一下自己这块的知识。      树(Tr...

SBTree的左旋右旋以及各种调整操作的基本实现(包含查找第k大的数值)

在完成了左旋和右旋操作之后,我们要实现调用两种单旋操作的逻辑,也就是调整操作。在插入之后,一共有 44 种触发旋转的情况,分别为 LL 型、LR 型、RR 型和 RL 型。通过旋转的名称,可以很直观的...

【字符串】旋转字符串(左旋或右旋k个字符)

问题描述将N个字符的数组,循环右移K位。时间复杂度O(N)。 比如原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。问题分析方法1、暴力位移法,时间复杂度为O...

判断一个字符串是否为另外一个字符串左旋或右旋之后的字符串。

#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include void show(char arr[], int len)...

易的核心理念之天道左旋、地道右旋

首先要特别说明,此文是在一位称为阿润的博友反复督促之下才形成,草根在这里要特别言谢。 说道天道左旋与地道右旋的问题,就必须要提到易原图,此图已经反复在博文中晒过,但由于太过重要还要重新晒出: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试热门题:字符串左旋右旋
举报原因:
原因补充:

(最多只允许输入30个字)