题目
剑指 Offer 05. 替换空格
思路
遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。
不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的动画比较好理解:
代码随想录
代码
public String replaceSpace(String s) {
// String temp = "%20";StringBuilder s_new = new StringBuilder();for (int i = 0; i < s.length(); i++) {char temp = s.charAt(i);if(temp - ' ' == 0){//判断当前字符是否为空格s_new.append("%20");}else {s_new.append(temp);}}return s_new.toString();}public String replaceSpace_1(String s) {// 使用双指针 不使用额外的空间// 首先扩展原字符串的空间 一个空格就需要多2个位置int count = 0;// 用来存储扩展的空格StringBuilder s_append = new StringBuilder();for (int i = 0; i < s.length(); i++) {char temp = s.charAt(i);if(temp == ' '){//判断当前字符是否为空格 为空格则往s_append中加入两个空字符s_append.append(" ");}}// 左指针指向原字符串中最后一个字符int l = s.length()-1;// 将两个空间链接到一起s += s_append.toString();// 右指针指向新字符的最后一个位置int r = s.length()-1;// 将字符串改为char数组 方便使用下标对字符串内容进行修改char[] s_array = s.toCharArray();// 进入循环 退出条件为左指针遍历完左边所有字符while (l >= 0){// l指针所在位置为空格if(s_array[l] == ' '){s_array[r--] = '0';s_array[r--] = '2';s_array[r] = '%';}else {s_array[r] = s_array[l];}r --;l --;}return new String(s_array);
// return s_array.toString();}
题目
151. 反转字符串中的单词
思路
对字符串按空格进行分割,逆序遍历得到的字符串数组,将不为空格的(由于存在连续空格,按空格分割会保留一个空格)字符串添加到新字符串中,添加完一个字符串就加入一个空格,最后跳出循环后删掉最后一个空格即可。
代码
public String reverseWords(String s) {String[] s_subs = s.split(" ");StringBuilder s_new = new StringBuilder();for (int i = s_subs.length - 1; i >= 0; i--) {
// System.out.println(s_subs[i]);if(!s_subs[i].isEmpty()) {System.out.println(s_subs[i]);s_new.append(s_subs[i]);s_new.append(" ");}}// 删掉最后一个空格s_new.deleteCharAt(s_new.length() -1);return s_new.toString();}