344和541来自leetcode,54来自卡玛网
344.反转字符串
很简单的一道题,直接把数组一分为二,第一个和最后一个互换就行,直到遍历到数组一半,就结束了,从第一个往后就是s[i],最后一个往前就是s[s.lenght - i - 1]。
public class Solution {
public void reverseString(char[] s) {
for (int i = 0; i < s.length / 2; i++) {
char c = s[i];
s[i] = s[s.length - i];
s[s.length - i] = c;
}
}
}
541.反转字符串||
自己做的时候写了一堆逻辑,又是算有几个2k,又是各种计数,把自己绕进入了,求饶了直接看题解了。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
有点绕,耐心看我写,首先这个for循环中的i是以2k大小来-跳动的,也就是每个for循环处理的都是一个2k大小区间内的数据,最后一定会剩下一个不到2k大小的块,此时我们再看题目中要求的,剩余数小于k个时全部翻转,大于k小于2k时翻转前k个,注意!!此时我们是最后一个2k区间内,我们只要翻转前k个就行,不管他什么条件,第一个条件我们满足了,第二个条件翻转前k个我们也满足了,因为这个处理完我们的for循环就结束了。这点一定要注意。
再就是下面的end = Math.min(ch.length - 1,start + k - 1),start是每个2k大小区间内的左指针,end是这个区间内的右指针,我们在前面正常处理时(就是不是最后一个),取到的都是end = start + k - 1,此时我们再看上面的i,他是整个2k区间跳动的,所以这个start是买个区间的开头,再+k就是这个2k区间内的第k个,因为是数组下标我们再-1。
然后就是跟341题一样的翻转数组就行。
public class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// i每次跳动的位置是2k,也就是一个2k区间,在每个区间内去判断翻转
for (int i = 0; i < ch.length; i += 2 * k) {
int start = i;
// 判断尾数够不够k个,来决定end指针的位置
// start + k就是一个k的区间,其实条件就是最后不管剩多少都翻转前k个
// 就是,i是一整个2k大小的块来移动的,所以最后肯定剩一个不到2k大小的块,不管是哪个条件,
// 他都是翻转前k个,然后翻转完以后这个for循环就跳出去了,正好也满足了题目中的条件2
int end = Math.min(ch.length - 1,start + k -1);
while (start < end) {
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
卡玛网54.替换数字
题目链接:54. 替换数字(第八期模拟笔试)
自己想法是循环找到所有数字在的下标,然后存在一个数组里,通过split方法和append方法来每次去掉数字并且拼上number,但是做着做着就寄了,因为不会用。
实际做法很简单,就是先找出有几个数组,然后把数组扩容一下,然后从后往前的去放字符,遇到数字就倒着放一个“number”然后i-5就行,看这个链接中的图,然后看我下面代码中的注释很轻松的就可以理解:替换数字 | 代码随想录
public class Solution {
public static String replaceNumber(String s) {
int count = 0;
int sOldSize = s.length();
for (int i = 0; i < s.length(); i++) {
// 数一下有几个数字
if(Character.isDigit(s.charAt(i))) {
count++;
}
}
// 扩充字符串s的大小,也就是每个数字替换成“number”之后的大小
char[] newS = new char[s.length() + count * 5];
int sNewSize = newS.length;
// 把原来的s放在这个新的更大的数组里
System.arraycopy(s.toCharArray(),0,newS,0,sOldSize);
// 从后往前把数字替换为“number”
for (int i = sNewSize,j = sOldSize;j < i;j--,i--) {
// 不是数字的就放到最后去
if(!Character.isDigit(newS[j])) {
newS[i] = newS[j];
}else {
newS[i] = 'r';
newS[i - 1] = 'e';
newS[i - 2] = 'b';
newS[i - 3] = 'm';
newS[i - 4] = 'u';
newS[i - 5] = 'n';
// 向左移动5位,因为是从右往左去列数的
i -= 5;
}
}
return new String(newS);
}
}
标签:ch,int,反转,随想录,start,length,字符串,newS,2k
From: https://blog.csdn.net/m0_61579911/article/details/143906208