刷题日记
今天的主题是字符串
344. 反转字符串
class Solution {
public void reverseString(char[] s) {
char temp;
int left = 0;
int right = s.length - 1;
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
541. 反转字符串 II
每隔2k个数反转前k个数,这道题考察的还是基础的代码能力,循环遍历时i应该i += 2*k ,除此之外,今天又复习了异或运算可以用来交换两个值(具体可以复习异或运算的交换律和恒等律)。
class Solution {
public String reverseStr(String s, int k) {
char[] res = s.toCharArray();
int left;
int right;
for(int i = 0; i < s.length(); i += 2*k){
left = i;
right = Math.min(left + k - 1, s.length() - 1);
while(left < right){
res[left] ^= res[right];
res[right] ^= res[left];
res[left] ^= res[right];
left++;
right--;
}
}
return new String(res);
}
}
151. 反转字符串中的单词
一道看起来很简单,实际上有点复杂的题。 一开始的思路是用split分割字符串,但总是会有额外的空格。 后来借鉴了Carl老师的思路,先去除字符串首尾和中间多余的空格,然后翻转整个字符串,再翻转每个单词。
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
//去除字符串首尾和中间多余的空格
int start = 0;
int end = s.length() - 1;
while(s.charAt(start) == ' ') start++;
while(s.charAt(end) == ' ') end--;
while(start <= end){
if(s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' '){
sb.append(s.charAt(start));
}
start++;
}
//翻转整个字符串
int left = 0;
int right = sb.length() - 1;
while(left < right){
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
//翻转每个单词
left = 0;
right = 0;
for(int i = 0; i < sb.length(); i++){
if(sb.charAt(i) != ' ' && (i == 0 || sb.charAt(i - 1) == ' ')){
left = i;
}
if(sb.charAt(i) != ' ' && (i == sb.length() - 1 || sb.charAt(i + 1) == ' ')){
right = i;
reverseWord(left, right, sb);
}
}
return sb.toString();
}
public void reverseWord(int left, int right, StringBuilder sb){
while(left < right){
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
}
}
剑指 Offer 05. 替换空格
easy题,没什么说的
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == ' '){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
剑指 Offer 58 - II. 左旋转字符串
easy题,没什么说的
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
for(int i = 0; i < n; i++){
temp.append(s.charAt(i));
}
for(int j = n; j < s.length(); j++){
sb.append(s.charAt(j));
}
sb.append(temp);
return sb.toString();
}
}