今天写字符串,这边的操作还是蛮多的,这两天刷其他题用到不少字符串的操作,有空可以整理下,今天先mark。也没几张壁纸了,只是单纯觉得系统生成的有点丑。
1.反转字符串:代码随想录 (programmercarl.com)
力扣链接:. - 力扣(LeetCode)
这个题太熟了,双指针的入门用法。建议熟悉一种双指针写法,多写一写。随想录给的交换两数的操作也是学到了,除了用temp变量,也可以用异或运算。异或交换没有中间变量。模板看几次就知道了,但是就是不方便阅读。感觉平时做题可以用,写代码最好还是写方便阅读的。
异或交换需要学习一下位运算。异或的规则,对于一堆数里找奇数次方的题非常高效。
class Solution {
public void reverseString(char[] s) {
int l = 0;
int r = s.length - 1;
while (l < r) {
s[l] ^= s[r]; //构造 a ^ b 的结果,并放在 a 中
s[r] ^= s[l]; //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
s[l] ^= s[r]; //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
l++;
r--;
}
}
}
// 第二种方法用temp来交换数值更多人容易理解些
class Solution {
public void reverseString(char[] s) {
int l = 0;
int r = s.length - 1;
while(l < r){
char temp = s[l];
s[l] = s[r];
s[r] = temp;
l++;
r--;
}
}
}
2.反转字符串2:代码随想录 (programmercarl.com)
力扣链接:. - 力扣(LeetCode)
没看懂代码,周末复习下,忘记了。
3.替换数字:替换数字 | 代码随想录 (programmercarl.com)
卡码网链接:54. 替换数字(第八期模拟笔试)
这个题不是很难,如果要用库函数那就更容易了,个人觉得for+replace或者正则匹配替换这种都行?所以这个题看能不能用基础代码写出来,了解一下替换的原理,比如Java的替换数字就没法在原数组上操作,必须要新建一个。为什么新建一个,新建大小多少,随想录给的代码操作逻辑是什么。这些都要想一下。
这道题随想录也用了双指针,但是这个写法很巧妙,尤其是j<i的时候,第一次看到没觉得有什么不同,边界而已。但是第二次就想,j和i不是同步减少吗,i一次最多减少5格,为啥可以退出循环。这次再看到是感觉j=i时候就推出循环了,刚好遍历完。
这道题自己也闭卷打代码打了一次,run时候报错了,发现没考虑到j和i的值,还把i--写成j--了,这都是潜意识的东西,但是也反映出对这些的操作理解不深刻。
注意j和i的边界值。注意array是怎么copy的,用法是什么。注意不是数字的情况,一定要记得赋值。
package LuStudy;
public class _8_2ReplaceNumber {
private static String getReplaceNumber(String s) {
int countNumber = 0;
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
countNumber++;
}
}
char[] newS = new char[s.length() + countNumber * 5];
System.arraycopy(s.toCharArray(), 0, newS, 0, s.length());
for (int i = newS.length - 1, j = s.length() - 1; j < i; j--, i--) {
if (!Character.isDigit(s.charAt(j))) {
newS[i] = newS[j];
continue;
} else {
newS[i] = 'r';
newS[i - 1] = 'e';
newS[i - 2] = 'b';
newS[i - 3] = 'm';
newS[i - 4] = 'u';
newS[i - 5] = 'n';
i -= 5;
}
}
return new String(newS);
}
public static void main(String[] args) {
String s = "a1b2c3d";
System.out.println(getReplaceNumber(s));
}
}