微软面试100题---左旋字符串
2016-09-04 02:57
309 查看
题目
定义字符串的左旋操作:将字符串前面的若干个字符移动到字符串的尾部;如”abcde“左旋2位–》”cdeab“实现
方法1
思路:ab–>bacde–>edc
baedc–>cdeab
分3部分反转
代码:
public static void leftStr_1(StringBuilder str,int k){ int n=str.length(); k=k%n;//为了防止k比n大,右移k位与右移k%n位结果一样 reverse(str,0,k-1); reverse(str,k,n-1); reverse(str,0,n-1); System.out.println(str); } private static void reverse(Str 4000 ingBuilder str,int start,int end){ while(start<=end){ char tmp=str.charAt(start); str.setCharAt(start, str.charAt(end)); str.setCharAt(end, tmp); start++; end--; } }
方法2
思路:使用2个指针逐步翻转。abc defghi,要abc移动至最后
abc defghi->def abcghi->def ghiabc
定义俩指针,p1指向ch[0],p2指向ch[m];
一下过程循环m次,交换p1和p2所指元素,然后p1++, p2++;。
第一步,交换abc 和def ,
abc defghi->def abcghi
第二步,交换abc 和 ghi,
def abcghi->def ghiabc
整个过程,看起来,就是abc 一步一步 向后移动
abc defghi
def abcghi
def ghi abc
如果是要左旋十个元素的序列:abcdefghij,ok,下面,就举这个例子,对abcdefghij序列进行左旋转操作:
如果abcdef ghij要变成defghij abc:
abcdef ghij
1. def abc ghij
2. def ghi abc j //接下来,j 步步前移
3. def ghi ab jc
4. def ghi a j bc
5. def ghi j abc
下面,再针对上述过程,画个图清晰说明下,如下所示:
总的过程:
1、首先让p1=ch[0],p2=ch[m],即让p1,p2相隔m的距离;
2、判断p2+m-1是否越界,如果没有越界转到3,否则转到4(abcdefgh这8个字母的字符串,以4左旋,那么初始时p2指向e,p2+4越界了,但事实上p2至p2+m-1是m个字符,可以再做一个交换)。
3、不断交换*p1与*p2,然后p1++,p2++,循环m次,然后转到2。
4、此时p2+m-1 已经越界,在此只需处理尾巴。过程如下:
4.1 通过n-p2得到p2与尾部之间元素个数r,即我们要前移的元素个数。
4.2进行下列操作r次
将p2与前一个交换;直到交换到p1;
代码实现:
public static void leftStr_2(StringBuilder str,int k){ int n=str.length(); if(n==0||k<0){ return; } if(k%n==0){ return; } int p1=0,p2=k; int m=n-k-n%k; while(m!=0){ char tmp=str.charAt(p1); str.setCharAt(p1, str.charAt(p2)); str.setCharAt(p2, tmp); p1++; p2++; m--; } int r=n-p2; while(r!=0){ int i=p2-1; char ch=str.charAt(p2); while(i>=p1){ str.setCharAt(i+1, str.charAt(i)); i--; } str.setCharAt(i, ch); r--; p2++; p1++; } System.out.println(str); }
方法3
递归,方法2思路相同,是不过通过递归实现;设原始问题为:将“123abcdefg”左旋转为“abcdefg123”,即总长度为10,旋转部(“123”)长度为3的左旋转。
按照思路二的运算,演变过程为“123abcdefg”->”abc123defg”->”abcdef123g”。这时,”123”无法和”g”作对调,该问题递归转化为:将“123g”右旋转为”g123”,即总长度为4,旋转部(“g”)长度为1的右旋转。
相关文章推荐
- 微软等数据结构+算法面试100题(39)-- 左旋数组中查找
- 微软等数据结构+算法面试100题(24)--对称字符串的最大长度
- 字符串联接 【微软面试100题 第三十七题】
- 【从零单排之微软面试100题系列】20之把字符串转换成整数
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- 微软等数据结构+算法面试100题(2)--给出一个函数来输出一个字符串的所有排列
- 左旋转字符串 【微软面试100题 第二十六题】
- 字符串的排列 【微软面试100题 第五十三题】
- 字符串转换成整数 【微软面试100题 第二十题】
- 字符串问题 【微软面试100题 第八十五题】
- 微软等数据结构+算法面试100题(17)--复制两个字符串A 和B
- 微软面试100题之20题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 微软面试100题之26题:左旋转字符串
- 字符串的排列 【微软面试100题 第五十三题】
- 字符串中找出最长的数字串 【微软面试100题 第二十五题】
- 微软等数据结构+算法面试100题(11)--压缩字符串
- 微软面试100题目之17 :在一个字符串中找到第一个只出现一次的字符。
- 字符串中找出最长的数字串 【微软面试100题 第二十五题】
- 对称字符串的最大长度 【微软面试100题 第七十三题】
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】