题目
题目来源:卡码网 55. 右旋字符串(第八期模拟笔试)
解析
两种解达方式,法一独立作答使用辅助空间。法二参考卡哥解析,采用与昨天题目一样的思路,字符串反转,整体部分分别反转的思想,不需要额外的辅助空间。 推荐法二,法一较为暴力。
法一:
//方法一 辅助数组 O(k)空复
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int k = Integer.parseInt(scanner.nextLine());
String str = scanner.nextLine();
char[] c = str.toCharArray();
if (k>c.length){
return ;
}
//双指针找到倒数第k个字符的起始位置,定义一个辅助数组,大小k
char[] temp = new char[k];
int fast =0,slow=0,index=0;
while(fast<c.length){
if(fast>=k){
fast++;
slow++;
}else{
fast++;
}
}
//找到了slow之后
for(int i=0;i<k;i++,slow++){
temp[i] = c[slow];
}
for(int j=c.length-1;j>=k;j--){
c[j] = c[j-k];
}
for(int i=0;i<k;i++){
c[i] = temp[i];
}
System.out.println(String.valueOf(c));
}
法二:
/**方法二 反转字符串,不借助辅助空间*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = Integer.parseInt(sc.nextLine());
String string = sc.nextLine();
char[] charArray = string.toCharArray();
//先整体反转,再局部反转
reverseString(charArray,0,charArray.length-1);
reverseString(charArray,0,k-1);
reverseString(charArray,k,charArray.length-1);
System.out.println(String.valueOf(charArray));
}
public static void reverseString(char[] chars,int low,int high) {
while (low < high) {
char temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}