- leetcode 344 反转字符串 easy
题目链接: leetcode.com/problems/re…
思路: 两头双指针中间走。交换变量不用思路了,临时变量交换两个变量的值和位运算交换变量已经写烂了。
代码:
class Solution {
public void reverseString(char[] s) {
int start = 0;
int end = s.length - 1;
while (start < end) {
s[start] ^= s[end];
s[end] ^= s[start];
s[start] ^= s[end];
start++;
end--;
}
}
}
提交报错 (1):
第1次: 不认真并画蛇添足,题目void写了return, 题目传参直接是字符数组,当做字符串转数组报错。
- leetcode 541 反转字符串II easy
题目链接: leetcode.com/problems/re…
思路: 循环步长2k锁定处理范围,判定进一步锁定翻转范围k以内,特殊处理长度不足k的情况。常用函数实现翻转给定字符串的给定范围。
代码:
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i += 2 * k) {
if (i + k <= arr.length) {
reverse (arr, i, i + k - 1);
continue;
}
reverse(arr, i, arr.length - 1);
}
return new String(arr);
}
public void reverse (char[] arr, int start, int end) {
while (start < end) {
arr[start] ^= arr[end];
arr[end] ^= arr[start];
arr[start] ^= arr[end];
start++;
end--;
}
}
}
提交报错 (2)
第1次: 死循环导致time limit exceed, 因为没有移动reverse函数start和end指针位置。
第2次: 没有考虑到长度不足k的情况,也就是判断外的操作,导致没有任何翻转操作。
- leetcode 151 翻转字符串里的单词 easy
题目链接: leetcode.com/problems/re…
思路: 主要分为三个步骤,一是快慢双指针处理掉多余的空格,双指针移动逻辑,快指针找空格,慢指针补充该有的空格。二是翻转整个字符串。三是翻转每个单词,分别写函数处理。
代码:
class Solution {
public String reverseWords(String s) {
char[] arr = s.toCharArray();
arr = removeSpace(arr);
reverseString(arr, 0, arr.length - 1);
reverseEachWord(arr);
return new String(arr);
}
public char[] removeSpace(char[] arr) {
int slow = 0;
for (int fast = 0; fast < arr.length; fast++){
if (arr[fast] != ' ') {
if (slow != 0) {
arr[slow++] = ' ';
}
while (fast < arr.length && arr[fast] != ' ') {
arr[slow++] = arr[fast++];
}
}
}
char[] newArr = new char[slow];
System.arraycopy(arr, 0, newArr, 0, slow);
return newArr;
}
public void reverseString(char[] arr, int start, int end){
while (start < end) {
arr[start] ^= arr[end];
arr[end] ^= arr[start];
arr[start] ^= arr[end];
start++;
end--;
}
}
public void reverseEachWord(char[] arr) {
int start = 0;
for (int end = 0; end <= arr.length; end++) {
if (end == arr.length || arr[end] == ' ') {
reverseString(arr, start, end - 1);
start = end + 1;
}
}
}
}
提交报错 (1):
第1次:
- 剑指Offer 05 替换空格 easy
题目链接: leetcode.cn/problems/ti…
思路: 先找到空格位置增加空间,在新的数组空间快慢指针从右出发,找到空格则替换成%20,否则直接替换。
代码:
class Solution {
public String replaceSpace(String s) {
if (s.length() == 0) return s;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
sb.append(" ");
}
}
if (sb.length() == 0) return s;
int left = s.length() - 1;
s += sb.toString();
int right = s.length() - 1;
char[] newS = s.toCharArray();
while (left >= 0) {
if (newS[left] == ' ') {
newS[right--] = '0';
newS[right--] = '2';
newS[right] = '%';
} else {
newS[right] = newS[left];
}
left--;
right--;
}
return new String(newS);
}
}
提交报错 (1):
第1次: index out of range错误,int left = s.length();应为int left = s.length() - 1;。
- 剑指Offer 58 - II. 左旋转字符串 easy
题目链接: leetcode.cn/problems/zu…
思路: 翻转字符串的给定始终位置方法妙用
代码:
class Solution {
public String reverseLeftWords(String s, int n) {
char[] newS = s.toCharArray();
reverse(newS, 0, n - 1);
reverse(newS, n, newS.length - 1);
reverse(newS, 0, newS.length - 1);
return new String(newS);
}
public void reverse (char[] arr, int start, int end) {
while (start < end) {
arr[start] ^= arr[end];
arr[end] ^= arr[start];
arr[start] ^= arr[end];
start++;
end--;
}
}
}
提交报错 (2):
第1次: toCharArray方法拼写错误, 写成toCharArrary。
第2次: 翻转逻辑想错,如果先翻转整个字符,则长度位置变化。逻辑不清晰错误。
错误逻辑
reverse(newS, 0, newS.length - 1);
reverse(newS, 0, n - 1);
reverse(newS, n, newS.length - 1);
改法A
reverse(newS, 0, n - 1);
reverse(newS, n, newS.length - 1);
reverse(newS, 0, newS.length - 1);
改法B
reverse(newS, 0, newS.length - 1);
reverse(newS, 0, newS.length - n - 1);
reverse(newS, newS.length - 1 - n, newS.length - 1);
- 58 最后一个单词的长度 easy
题目链接: leetcode.cn/problems/le…
思路:
代码:
class Solution {
public int lengthOfLastWord(String s) {
int right = s.length() - 1;
while (right >= 0 && s.charAt(right) == ' ') right--;
if (right < 0) return 0;
int left = right;
while (left >= 0 && s.charAt(left) != ' ') left--;
return right - left;
}
}
提交报错 (3):
第1次: 思路错误
第2次: 特殊case错误 testcase1: "H" testcase2: "H "
第3次: runtime error