前言
今天开始算法进入字符串专项练习,今日任务:
344. 反转字符串
题目描述
网络异常,图片无法展示
|
思路分析
这个类似于双指针, 两个元素交换
代码展示
public static void reverseString(char[] s) { for (int i = 0; i < s.length / 2; i++) { char temp = s[i]; s[i] = s[s.length - i - 1]; s[s.length - i - 1] = temp; } } 复制代码
提交记录
网络异常,图片无法展示
|
541. 反转字符串 II
题目描述
网络异常,图片无法展示
|
思路分析
先对每 2k个数按照要求进行反转, 然后在判断最后几个数要反转的下标, 按要求进行反转
代码展示
public static String reverseStr(String s, int k) { char[] chars = s.toCharArray(); int left = 0, right = 2 * k; while(right < s.length()){ int m = left + k - 1; while(left < m){ char temp = chars[left]; chars[left++] = chars[m]; chars[m--] = temp; } left = right; right += 2*k; } right = s.length() - left < k ? s.length() - 1: left + k - 1; while(left < right){ char temp = chars[left]; chars[left++] = chars[right]; chars[right--] = temp; } return String.valueOf(chars); } 复制代码
提交结果
网络异常,图片无法展示
|
剑指 Offer 05. 替换空格
题目描述
网络异常,图片无法展示
|
思路分析
- 遍历字符串
- 每个字符串是否为 空格
- 如果为空格则替换为 %20
- 使用 StringBuilder,因为要进行多次的字符串修改操作
代码展示
public static String replaceSpace(String s) { char[] chars = s.toCharArray(); StringBuilder str = new StringBuilder(); for (char aChar : chars) { if(aChar == ' '){ str.append("%20"); }else{ str.append(aChar); } } return str.toString(); } 复制代码
提交结果
网络异常,图片无法展示
|
151. 反转字符串中的单词
题目描述
网络异常,图片无法展示
|
思路分析
简单来说就是遍历字符串保存每一个单词,然后倒序输出就可以了
注意事项:
- 字符串以空格开头
- 字符串以空格结尾
- 每两个单词中间存在多个空格
代码展示
public static String reverseWords(String s) { StringBuilder str = new StringBuilder(); char[] chars = s.toCharArray(); Stack<String> stack = new Stack<>(); for (char aChar : chars) { if (aChar == ' '){ if (!str.toString().equals("")){ stack.push(str.toString()); str = new StringBuilder(); } }else{ str.append(aChar); } } if (!"".equals(str.toString())){ stack.push(str.toString()); } str = new StringBuilder(); while(!stack.isEmpty()){ str.append(stack.pop()); str.append(' '); } return str.deleteCharAt(str.length() - 1).toString(); } 复制代码
提交记录
网络异常,图片无法展示
|
总结
可以看到,这道题每一次都会出现错误,每一次都是在细节的问题上,希望有一天做题能够考虑的更加周到
剑指 Offer 58 - II. 左旋转字符串
题目描述
网络异常,图片无法展示
|
思路分析
还是遍历字符串,根据 n来当做分界值,先遍历 >=n的值,在遍历 <n的值
【代码展示】中分别是上次提交和本次提交的代码, 咱也不知道为啥上次写的那么麻烦, 但是确实是执行用时会少一点,毕竟是在同一个字符串内进行操作,但是代码量会多很多,内存消耗差不多
代码展示
上次代码
public String reverseLeftWords(String s, int n) { char[] chars = s.toCharArray(); int length = chars.length; int t = n; for (int i = 0; i < n; i++) { n--; char temp = chars[i]; chars[i] = chars[n]; chars[n] = temp; } for (int i = t; i < length; i++) { char temp = chars[i]; chars[i] = chars[length - 1]; chars[length - 1] = temp; length--; } length = chars.length; for (int i = 0; i < length; i++) { char temp = chars[i]; chars[i] = chars[length - 1]; chars[length - 1] = temp; length--; } return String.valueOf(chars); } 复制代码
本次代码
public static String reverseLeftWords(String s, int n) { char[] chars = s.toCharArray(); StringBuilder str = new StringBuilder(); for (int i = n; i < chars.length; i++) { str.append(chars[i]); } for (int i = 0; i < n; i++) { str.append(chars[i]); } return str.toString(); } 复制代码
提交结果
网络异常,图片无法展示
|
总结
字符串专项练习截止到目前依旧是拿捏,根据目前的练习,字符串方面主要还是以遍历为主,依托于遍历来进行的各种其他操作