Leetcode 344 力扣
解法:双指针使用temp交换位置
public static char[] reverseString(char[] s) { int left = 0 ; int right = s.length -1; while (right >left){ char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } return s; }
Leetcode 541 力扣
解法:双指针+循环遍历2k步长
public static String reverseStr(String s, int k) { char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i+=2*k) { if (i+k <= chars.length){ reverse(chars,i,i+k-1);// 左闭右开区间 continue; // 跳出本次循环 } reverse(chars,i ,chars.length-1); } return new String(chars); } private static void reverse(char[] chars, int i, int j) { while (i < j){ char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; i++; j--; } }
Leetcode 剑指 Offer 05. 替换空格 力扣
解法:库函数replace
public static String replaceSpace(String s) { // 需要使用枚举方式和双指针方式加练 return s.replace(" ", "%20"); }
public static 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); }
private static 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; // 下个单词反转起始位置加上单词间空格1 } } } private static void reverse(char[] chars, int i, int j) { while (i < j){ char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; i++; j--; } } private static char[] removeExtraSpaces(char[] chars) { int slow = 0; for (int fast = 0; fast < chars.length; fast++) { //先用 fast 移除所有空格,获取字母元素 if (chars[fast] != ' ') { //在用 slow 加空格。 除第一个单词外slow位置不为0,单词末尾要加空格 if (slow != 0) chars[slow++] = ' '; //fast 小于长度且fast获取到为元素,将fast值存到slow下标的位置 while (fast < chars.length && chars[fast] != ' ') chars[slow++] = chars[fast++]; } } // slow位置记录单词位置 char[] newChars = new char[slow]; // 数组拷贝 System.arraycopy(chars, 0, newChars, 0, slow); return newChars; }
Leetcode 剑指 Offer 58 - II. 左旋转字符串 力扣
解法:使用额外字符串空间。需要使用双指针解法练习
public static String reverseLeftWords(String s, int n) { String substring1 = s.substring(0, n); String substring2 = s.substring(n); StringBuilder builder = new StringBuilder(); builder.append(substring2).append(substring1); return builder.toString(); }