344.反转字符串(不需要看)
双指针
class Solution {
public void reverseString(char[] s) {
char temp;
int left=0, right=s.length - 1;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
541. 反转字符串II
判断条件有点多,复杂化了。
class Solution {
public String reverseStr(String s, int k) {
StringBuilder sb = new StringBuilder();
int start = 0, end = s.length();
while(start < end){ // 左闭右开
if(start+2*k>end){
if(start+k>end){
StringBuilder temp = new StringBuilder(s.substring(start, end));
sb.append(temp.reverse());
}else{
StringBuilder temp = new StringBuilder(s.substring(start, start+k));
sb.append(temp.reverse());
sb.append(s.substring(start+k, end));
}
}else{
StringBuilder temp = new StringBuilder(s.substring(start, start+k));
sb.append(temp.reverse());
sb.append(s.substring(start+k, start+2*k));
}
start += 2*k;
}
return sb.toString();
}
}
代码随想录解法:
- 用
?:
代替if
判断 - 用
Math.min
- 循环的条件是
for(int i = 0; i < ch.length; i += 2 * k)
而非for(int i=0; i<ch.length/(2*k); i++)
,更容易理清楚。
//解法一
class Solution {
public String reverseStr(String s, int k) {
StringBuffer res = new StringBuffer();
int length = s.length();
int start = 0;
while (start < length) {
// 找到k处和2k处
StringBuffer temp = new StringBuffer();
// 与length进行判断,如果大于length了,那就将其置为length
int firstK = (start + k > length) ? length : start + k;
int secondK = (start + (2 * k) > length) ? length : start + (2 * k);
//无论start所处位置,至少会反转一次
temp.append(s.substring(start, firstK));
res.append(temp.reverse());
// 如果firstK到secondK之间有元素,这些元素直接放入res里即可。
if (firstK < secondK) { //此时剩余长度一定大于k。
res.append(s.substring(firstK, secondK));
}
start += (2 * k);
}
return res.toString();
}
}
//解法二(似乎更容易理解点)
//题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i += 2 * k){
int start = i;
//这里是判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1, start + k - 1);
//用异或运算反转
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
// 解法二还可以用temp来交换数值,会的人更多些
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int start = i;
// 判断尾数够不够k个来取决end指针的位置
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.替换数字
使用sb不符合题目本意,但是实际上也就是倒着填充。较为简单,不再实现。
- Scanner导入、System.in、关闭。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.next();
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()){
if(c>='0' && c<='9') sb.append("number");
else sb.append(c);
}
System.out.println(sb.toString());
sc.close();
}
}