学习目标:
60天训练营打卡计划!
字符串实现!
学习内容:
344.反转字符串
- 一个简单的双指针法带走!
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
}
541. 反转字符串II
- String和char的互换操作不熟悉。谨记!
-
- char[] ch = s.toCharArray(); 可将String变为char。
-
- new String(ch) 就可以返回String。
- 本题做交换时的end只有两种情况:Math.min(ch.length - 1,start + k - 1);
-
- 太妙了!
-
- 剩余长度大于k时,要交换的长度为start + k - 1;否则为ch.length - 1。
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);
}
}
剑指Offer 05.替换空格
- 新建字符串,将原字符串为空的位置直接替换。
- 或者就是先新建一个字符串,再使用双指针法(感觉没有意义)。
class Solution {
public:
string replaceSpace(string s) {
// write code here
string res = "";
for(int i = 0 ; i < s.length() ; i++)
{
if(s.at(i) != ' ')
{
res += s.at(i);
}
else res += "%20";
}
return res;
}
};
151.翻转字符串里的单词
- 好复杂,思路很清晰,但实现时需考虑很多要素。
-
- 第一步:先对原字符串进行去空格的操作!— 双指针法
-
- 第二步:对去空格后的字符进行全部翻转。 — 双指针法
-
- 第三步: 找到空格的位置后,按单词再单独反转。 — 双指针法
- 等周日再做一遍!!
class Solution {
private char[] removeBlank(char[] ch){
int slow = 0;
for(int fast = 0; fast < ch.length; fast++){
// 下一个单词进入该if,并给slow增加' '
// fast直接跳过所有的空格
// slow自己补足空格
if(ch[fast] != ' '){
if(slow != 0)
ch[slow++] = ' ';
// 直到一个单词完全循环结束时才退出
while(fast < ch.length && ch[fast] != ' ')
ch[slow++] = ch[fast++];
}
}
// 当于 c++ 里的 resize()
char[] newch = Arrays.copyOf(ch, slow);
// char[] newch = new char[slow];
// System.arraycopy(ch,0,newch,0,slow);
return newch;
}
private void reverse(char[] ch ,int left ,int right){
while(left < right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
public String reverseWords(String s) {
int start = 0;
char[] ch = removeBlank(s.toCharArray());
reverse(ch ,0 , ch.length - 1);
// 查找空格
for(int end = 0; end <= ch.length; end++){
// end 每次到单词末尾后的空格或串尾,开始反转单词
if (end == ch.length || ch[end] == ' ') {
reverse(ch, start, end - 1);
start = end + 1;
}
}
return new String(ch);
}
}
牛客网 - 左旋转字符串
- 和上述的151思路一致
- 题目链接:https://www.nowcoder.com/questionTerminal/12d959b108cb42b1ab72cef4d36af5ec
- 以n为界,分别对前后两段做翻转
- 再对整个数组做翻转。
- 我看之前的资源里并没有取余的操作,可是我这边必须要取一次余才可以通过。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param n int整型
* @return string字符串
*/
private String reverse(String str ,int left ,int right){
char[] ch = str.toCharArray();
while(left < right){
char tmp = ch[left];
ch[left] = ch[right];
ch[right] = tmp;
left++;
right--;
}
return new String(ch);
}
public String LeftRotateString (String str, int n) {
// write code here
int size = str.length();
if(str == " " || size == 0)
return "";
int t = n % size;
String tmp1 = reverse(str ,0 ,size - 1);
String tmp2 = reverse(tmp1 ,0 ,size - t - 1);
String tmp3 = reverse(tmp2 ,size - t ,size - 1);
return tmp3;
}
}
学习时间:
- 下午三小时(一个151做了两个半小时),晚上50分钟(左旋转字符串),整理文档半小时
- 12月13日复习,151中的删除多余的空格不是很熟悉!