学习目标:
每天复习代码随想录上的题目1-2道算法(时间充足可以继续)
今日碎碎念:
1)断更了很久是因为找到了实习,才刚稳定下来的。
2)也是慢慢调整好了自己,带着疑问去实习,能让我有东西在未来和面试官去交谈。
力扣刷题
算法
力扣541:541. 反转字符串 II
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
int len = ch.length;
for(int i = 0;i<len;i+=2*k){
int start = i;
//根据条件判断:因为每次是i+=2*k,所以只需要判断是否靠近末尾即可
//也就是是否已经大于长度,取最小即可
int end = Math.min(len-1,start+k-1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
力扣151:151. 反转字符串中的单词
class Solution {
/**
* 不使用Java内置方法实现
* <p>
* 1.去除首尾以及中间多余空格
* 2.反转整个字符串
* 3.反转各个单词
*/
public String reverseWords(String s) {
//去除空格
StringBuilder sb = removeSpace(s);
//翻转整个字符串
reverseString(sb, 0, sb.length() - 1);
//然后翻转各个单词
reverseEachWord(sb);
return sb.toString();
}
//去除空格
public StringBuilder removeSpace(String s){
//先去除前后空格
int start = 0;
int end = s.length() - 1;
//如果为空就往前/后
while(s.charAt(start) == ' ') start++;
while(s.charAt(end) == ' ') end--;
StringBuilder res = new StringBuilder();
//此时去检测中间空格
while(start <= end){
char c = s.charAt(start);
if(c != ' ' || c == ' ' && s.charAt(start-1) != ' '){
res.append(c);
}
start++;
}
return res;
}
//翻转整个字符串
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
//翻转各个单词
public void reverseEachWord(StringBuilder sb) {
//用start来标记所有单词的起始位置
int start = 0;
//用end来记录所有单词的结束位置
int end = 1;
//记录最长
int len = sb.length();
while(start < len){
//分别找到每个单词的结尾,注意到最后一个单词的时候不能超长
while(end<len && sb.charAt(end)!=' '){
end++;
}
//找到结尾之后就直接传入下标调用翻转函数
reverseString(sb,start,end-1);
//替换start(+1 是因为要跳过空格),end
start = end + 1;
end = start + 1;
}
}
}