344.反转字符串
初始思路&&题解复盘
class Solution {
public void reverseString(char[] s) {
/*有一种双指针的直觉*/
int start = 0;
int end = s.length-1;
while(start<=end){
char c = s[start];
s[start] = s[end];
s[end] = c;
start++;
end--;
}
}
}
很基础的题目,没什么好说的,跟题解的唯一区别在于我是start<=end,偶数时没有什么影响,奇数时start和end指针指向同一个元素并且交换的操作没什么意义,所以还是写为start<end比较好。
541. 反转字符串II
初始思路&&题解复盘
class Solution {
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
int start = 0;
int end = k-1;
int n = s.length()/(2*k);//前面反转的次数
int i = 0;
while(n>0){
while(start<=end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
n--;
i++;
start = 2*k*i;
end = start+k-1;
}
int res = s.length()%(2*k);//剩余字符的数目
if(res<k){
end = s.length()-1;
while(start<=end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
}else if(k<=res&&k<2*k){
end = start+k-1;
while(start<=end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
}
String s1 = new String(c);
return s1;
}
}
我的方法跟随想录的标答思路是一样的,但标答更为精简,把很多判断合在一起了
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1,start + k - 1);
替换数字
初始思路:
import java.util.Scanner;
public class Main {
public static String replaceNumber(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if('a'<= str.charAt(i)&&str.charAt(i)<='z'){
sb.append(str.charAt(i));
}else{
sb.append("number");
}
}
String strs = sb.toString();
return strs;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println(replaceNumber(str));
scanner.close();
}
}
被卡码网的写题格式困扰了很久。。。
题解复盘:
import java.util.Scanner;
public class Main {
public static String replaceNumber(String str) {
int count = 0;
int sOldSize = str.length();
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) { // 如果是数字字符
count++;
}
}
char[] newCharArray = new char[str.length() + count * 5];
int sNewSize = newCharArray.length;
System.arraycopy(str.toCharArray(), 0, newCharArray, 0, sOldSize);
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
if (!Character.isDigit(newCharArray[j])) {
newCharArray[i] = newCharArray[j];
} else {
newCharArray[i--] = 'r';
newCharArray[i--] = 'e';
newCharArray[i--] = 'b';
newCharArray[i--] = 'm';
newCharArray[i--] = 'u';
newCharArray[i] = 'n'; // 在 for 循环条件内 i 还会再减去一次
}
}
return new String(newCharArray);
};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println(replaceNumber(str));
scanner.close();
}
}
1.统计数字的数量,以计算新数组长度
2.将旧的字符数组拷贝到新的字符数组
3.i指向新长度的末尾,j指向旧长度的末尾。从旧数组从后往前,开始赋值到新数组,将s[j]赋值给s[i](旧赋给新),旧碰上数字,新往前移动并且倒着赋值rebmun
4.创建新的String返回
为什么从后往前?
从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。
感觉这道题只是锻炼从后往前赋值的思想,这个题解感觉并不是很简便。
151.反转字符串中的单词
写不动了先看题解吧,太多题了。
- 移除多余空格 :思路还挺巧妙地快指针不是空格的话就直接赋值给慢指针,快指针再次不是空格的时候,让慢指针后面加一个空格。
public static char[] removeExtraSpaces(char[] chars) { int slow = 0; for(int fast=0;fast<chars.length;fast++){ if(chars[fast]!=' '){ if(slow>0){chars[slow++]=' ';}//利用slow添加空格 while(fast<chars.length&&chars[fast]!=' ') {chars[slow++]=chars[fast++];} } } //相当于 c++ 里的 resize() char[] newChars = new char[slow]; System.arraycopy(chars, 0, newChars, 0, slow); return newChars; }
- 将整个字符串反转
- 将每个单词反转:end遇上空格,reverse之前,再让start=end+1;
public static char[] reverseEachWord(char[] chars){ int start = 0; for(int end = 0;end<chars.length;end++){ if(chars[end]==' '){ chars = reverse(chars,start,end-1); start = end+1; } } return chars; }
55.右旋字符串
初始思路&&题解复盘:
先整体逆转过来,然后再逆转前n个,和后length-n个
abcdefg--gfedcba--fgabcde
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//System.out.println("请输入向右旋转位数:");
int n = sc.nextInt();
//System.out.println("请输入要旋转的字符串:");
String str = sc.next();
System.out.println(right(n,str));
sc.close();
}
public static String right(int n,String s){
int start = 0;
int end = s.length()-1;
char[] c = s.toCharArray();
//先进行整体反转
while(start<end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
//再反转前n个
start = 0;
end= n-1;
while(start<end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
start = n;
end= c.length-1;
while(start<end){
char temp = c[start];
c[start] = c[end];
c[end] = temp;
start++;
end--;
}
String res = new String(c);
return res;
}
}