今日任务
- 151.翻转字符串里的单词
- 卡码网:55.右旋转字符串
- 28. 实现 strStr()(跳过,回头再写)
- 459.重复的子字符串(跳过,回头再写)
151.翻转字符串里的单词
思路
- 单词本身需要反转(用自定义方法就行)
- 多余的空格删掉
//解法二:创建新字符数组填充。时间复杂度O(n)
//倒着将旧数组输入到新数组,完成一个单词返回一次空格
class Solution {
public String reverseWords(String s) {
//源字符数组
char[] initialArr = s.toCharArray();
//新字符数组
char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
int newArrPos = 0;
//i来进行整体对源字符数组从后往前遍历
int i = initialArr.length-1;
while(i>=0){
while(i>=0 && initialArr[i] == ' '){i--;} //跳过空格
//此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
int right = i;
while(i>=0 && initialArr[i] != ' '){i--;}
//指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
for (int j = i+1; j <= right; j++) {
newArr[newArrPos++] = initialArr[j];
if(j == right){
newArr[newArrPos++] = ' ';//空格
}
}
}
//若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
if(newArrPos == 0){
return "";
}else{
return new String(newArr,0,newArrPos-1);
}
}
}
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
此题运用到了异或运算:(没搞懂回来再看吧)
a ^ a = 0
:任何数与自身异或的结果为0。a ^ 0 = a
:任何数与0异或的结果为其本身。- 异或运算具有交换律和结合律:
a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
StringBuilder sb = new StringBuilder();
sb.append(s.substring(s.length() - k, s.length()));
sb.append(s.substring(0, s.length() - k));
System.out.println(sb.toString());
}
}