Java-字符串的循环左移(右移)
昨天⾯试的时候被问到⼀个问题,当时考虑的不完善,今天仔细想了⼀下,写写思考过程;
问题:给你⼀个字符串,要求循环左移n位。⽐如对"abcdefg"循环左移2位,我们要得到"cdefgab"。附加条件:不能使⽤连续辅助空间(包括动态分配),只能使⽤若⼲单个变量(即O(1)空间)。
题⽬说的意思就是字符串的原地进⾏修改,先把字符串转为字符数组,在对数组进⾏三次反转(⼤部分博客也是这样的),但我的反转思路是先局部再整体在局部,保证要操作的字符数组下标从0开始,⽅便操作。
⽐如,字符数组为[a,b,c,d,e,f],左移两位结果为[c,d,e,f,a,b],左移数量为2,先把原数组前两位进⾏反转得到[b,a,c,d,e,f],在整体反转得到[f,e,d,c,a,b],再进⾏局部反转得到结果[c,d,e,f,a,b]。所以就是局部反转-整体反转-局部反转。
代码如下,有些细节写在注释⾥:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //从键盘输⼊获取信息
String str = sc.nextLine(); //得到原字符串
int num = sc.nextInt(); //得到左移位数
char[] chars = CharArray(); //转换为字符数组
int n = num%chars.length; //得到真实要位移的位数,输⼊位移的位数可能⼤于字符串长度
if (n == 0){ //针对不同的位移数进⾏不同的操作
System.out.println(String.valueOf(chars));
} else if (n == 1){
reChange(chars,chars.length);
reChange(chars,chars.length-n);
System.out.println(String.valueOf(chars));
}else {
java valueof
reChange(chars,n);
reChange(chars,chars.length);
reChange(chars,chars.length-n);
System.out.println(String.valueOf(chars));
}
}
/**
*
* @param chars 要反转的字符数组
* @param l 要反转的长度,默认从索引为0开始反转
*/
public static void reChange(char[] chars, int l){
char c;
for (int i = 0; i < l/2; i++) {
c = chars[i];
chars[i] = chars[l-i-1];
chars[l-i-1] = c;
}
}
上⾯是允许结果,输⼊字符串和位移的位数,如果是右移的话,思路是⼀样的,也是先局部再整体再局部,反正就是怎么⽅便怎么来,以上就是我对这道题的理解,谢谢⼤家阅读,欢迎各位⼤佬批评指正!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论