反转字符串
题目链接
https://leetcode.cn/problems/reverse-string/
这道题比较简单 由题可以知道 类似的题 翻转链表的方法都是一样的
采用双指针法 首尾各给一个指针! 然后一个往前移动 一个往后移动
他们交换首尾的元素即可
class Solution {
public void reverseString(char[] s) {
int i= 0;
int j =s.length - 1;
while( i< j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
反转字符串二
https://leetcode.cn/problems/reverse-string-ii/
这道题的解题思路
我一一分析
首先这道题和反转字符串最大的区别就是,它规定了条件 是2k 2k 为单位的 反转 满足2k 反转 前k个 然后判断尾数满足 大于k 还是小于 k
那么怎么去解决呢 我们知道遍历数组是 一个一个遍历的 i++ 也就是
那么这道题我们不能用i++去遍历 我们需要使用 i = i+2k 我们高中的时候学过 sin函数 三角函数 和 +2派 这样是一样的 很好理解
所以我们遍历 for循环 当然我们还需要一步 就是遍历之间 需要将string 转换成字符串 数组 别忘了
遍历完以后
我们是不是就需要判断条件了
我们仍然采用双指针的方法 , 来解决 问题 和第一题的 方法一样 定义 初始指针 start 和末尾指针
end end 指针需要去判断 我们原来的长度 和 start+ k-1 (start指针 最后再加上一个k的长度) 的大小
目的是判断最后的尾数 情况 是小于k 小于k 返回 原来的长度 大于k 返回 加上k的长度 然后反转
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替换空格
https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
这道题我们直接 new 一个新的对象 然后 遇到空格 替换变成 %20 其他直接复制。
class Solution {
public String replaceSpace(String s) {
if(s ==null){
return null;
}//先判断为空的情况
//单线程使用 StringBuilder
StringBuilder yjh = new StringBuilder();
for(int i =0 ; i<s.length();i++){
if(s.charAt(i) == ' '){ //判断是不是空的
yjh.append("%20");
}else{
yjh.append(s.charAt(i));
}
}
return yjh.toString();//使用toString方法 别忘记()
}
}
151.翻转字符串里的单词
https://leetcode.cn/problems/reverse-words-in-a-string/
解题思路 有很多种
我这里写我理解的一种方法
先把首尾的空格还有中间多余的空格都去掉
然后反转整个字符串
再反转单独单词的字符串
class Solution {
//用 char[] 来实现 String 的 removeExtraSpaces,reverse 操作
public String reverseWords(String s) {
char[] chars = s.toCharArray();
//1.去除首尾以及中间多余空格
chars = removeExtraSpaces(chars);
//2.整个字符串反转
reverse(chars, 0, chars.length - 1);
//3.单词反转
reverseEachWord(chars);
return new String(chars);
}
//1.用 快慢指针 去除首尾以及中间多余空格,可参考数组元素移除的题解
public char[] removeExtraSpaces(char[] chars) {
int slow = 0;
for (int fast = 0; fast < chars.length; fast++) {
//先用 fast 移除所有空格
if (chars[fast] != ' ') {
//在用 slow 加空格。 除第一个单词外,单词末尾要加空格
if (slow != 0)
chars[slow++] = ' ';
//fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了
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;
}
//双指针实现指定范围内字符串反转,可参考字符串反转题解
public void reverse(char[] chars, int left, int right) {
if (right >= chars.length) {
System.out.println("set a wrong right");
return;
}
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left] ^= chars[right];
left++;
right--;
}
}
//3.单词反转
public void reverseEachWord(char[] chars) {
int start = 0;
//end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置
for (int end = 0; end <= chars.length; end++) {
// end 每次到单词末尾后的空格或串尾,开始反转单词
if (end == chars.length || chars[end] == ' ') {
reverse(chars, start, end - 1);
start = end + 1;
}
}
}
}
左旋转字符串
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
reverse(chars, 0, chars.length - 1);
reverse(chars, 0, chars.length - 1 - n);
reverse(chars, chars.length - n, chars.length - 1);
return new String(chars);
}
public void reverse(char[] chars, int left, int right) {
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left] ^= chars[right];
left++;
right--;
}
}