力扣学习day05-3
剑指offer 05-替换空格
题目
代码实现
class Solution {
// public String replaceSpace(String s) {
// // 题目有说有长度,即s不为空。
// char[] sArray = s.toCharArray();
// String s2 = "";
// for(int i = 0;i < sArray.length;i++){
// if(sArray[i] == ' '){
// s2 = s2 + "%20";
// continue;
// }
// s2 = s2 + sArray[i];
// }
// return s2;
// }
// 速度优化,String底层是不可变的,所以通过+的方式会慢一点(大量空格的情况下)。6ms --> 0ms
public String replaceSpace(String s) {
StringBuilder str = new StringBuilder();
for(int i = 0;i < s.length();i++){
if(s.charAt(i) == ' '){
str.append(" ");
}
}
if(str.length() == 0){
return s;
}
int index1 = s.length() - 1;
s += str.toString();
int index2 = s.length() - 1;
char[] sArray = s.toCharArray();
while(index1 >= 0){
if(sArray[index1] == ' '){
sArray[index2--] = '0';
sArray[index2--] = '2';
sArray[index2--] = '%';
index1--;
} else{
sArray[index2--] = sArray[index1--];
}
}
return new String(sArray);
}
}
541-反转字符串II
题目
代码实现
class Solution {
public String reverseStr(String s, int k) {
char[] result = s.toCharArray();
int i = k * 2 - 1;
// 先将满足2k长度的模块前k反转
for(;i < result.length;i += k * 2){
int pre = i - k * 2 + 1;
int cur = i - k;
reverse(pre,cur,result);
}
// 然后将尾部按情况处理。
i = i - k * 2 + 1;
int cur = 0;
if(result.length - i < k){
cur = result.length - 1;
} else{
cur = i + k - 1;
}
reverse(i,cur,result);
return new String(result);
}
public void reverse(int pre,int cur,char[] result){
char temp = 'a';
while(pre < cur){
temp = result[pre];
result[pre] = result[cur];
result[cur] = temp;
pre++;
cur--;
}
}
// 其他大佬的更易理解且简洁的方法,不过速度测出来要慢一丢丢。0ms->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){
// ch[start] ^= ch[end];
// ch[end] ^= ch[start];
// ch[start] ^= ch[end];
// start++;
// end--;
// }
// }
// return new String(ch);
// }
}
151-翻转字符串里的单词
题目
代码
class Solution {
public String reverseWords(String s) {
char[] source = s.toCharArray();
// 第一步,去除多余的空格
int slow = 0;
int fast = 0;
// 去掉头部空格
while(fast < source.length && source[fast] == ' '){
fast++;
}
// 去掉中间多余空格
while(fast < source.length){
if(source[fast] == ' ' && source[fast - 1] == ' '){
fast++;
continue;
}
source[slow++] = source[fast++];
}
// 去掉尾部空格
if(source[fast - 1] == ' '){
slow--;
}
//造一个新的数组存放
char[] result = new char[slow];
for(int i = 0;i < result.length;i++){
result[i] = source[i];
}
// 第二步,反转整个字符串
reverse(0,result.length-1,result);
// 第三步,反转单词
fast = 0;
slow = 0;
while(fast < result.length){
if(result[fast] != ' '){
fast++;
continue;
}
reverse(slow,fast - 1,result);
slow = fast + 1;
fast++;
}
reverse(slow,fast - 1,result);
return new String(result);
}
public void reverse(int pre,int cur,char[] result){
char temp = 'a';
while(pre < cur){
temp = result[pre];
result[pre] = result[cur];
result[cur] = temp;
pre++;
cur--;
}
}
// 夜已深,其他大佬的风骚操作明天有时间再看了。
// 还有这个什么空间复杂度O(1)和原地解法明天记得看哈是不是。
}