344. 反转字符串
秒过
class Solution {
public void reverseString(char[] s) {
//使用双指针
int start = 0;
int end = s.length - 1;
while(start<=end){//⏰这里<也可以 因为针对奇数最中间的是无需交换的
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
}
541. 反转字符串Ⅱ
关键词:2k个操作可直接i+=2k
固化思维:for循环逐一遍历字符串,然后添加各种情况的限制条件,然后越加越多。但可以直接在for循环+2k去遍历操作
- 错误代码
class Solution {
public String reverseStr(String s, int k) {
int start = 0;
int end = k;
int time = 1;
for(int i=0; i<s.length(); i++){
if(s.length() - i < k){
end = s.length() - 1;
StringBuilder sb = new StringBuilder(s);
sb.reverse();
}
if(s.length() - i == k || s.length() - i < 2*k){
reverseString(s, start, end);
}
start = 2*k*time + 1;
end = 2*k*time + k;
if(i==2*k && start < s.length() - 1){
reverseString(s, start, end);
time++;
}
}
return s;
}
public void reverseString(String s, int start, int end) {
char[] c = s.toCharArray();
while(start<end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
}
}
- 我的解法(4ms)
class Solution {
public String reverseStr(String s, int k) {
for(int i=0; i<s.length(); i+=2*k){
//
if(i+k <= s.length()){
s = reverseString(s, i, i+k-1);
continue;
}
s = reverseString(s, i, s.length()-1);
}
return s;
}
public String reverseString(String s, int start, int end) {
char[] c = s.toCharArray();
while(start<end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
return new String(c);
}
}
- 实例解法(1ms)
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.替换数字
题目链接:kamacoder.com/problempage…
关键词:Character和String的库函数
Q:为什么从后向前填充?
A:其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
Java中String类型发生改变相当于新创建了一个String,所以直接使用StringBuilder
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
StringBuilder sb = new StringBuilder();
for(int i=0; i<s.length(); i++){
if(Character.isDigit(s.charAt(i))){
sb.append("number");
}
sb.append(s.charAt(i));
}
System.out.println(sb);
}
}