代码随想录算法训练营第8天|反转字符串I和II、替换数字
lc344反转字符串
思路
双指针左右开弓法
代码
class Solution { public void reverseString(char[] s) { int left = 0, right = s.length-1; while (left < right){ char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } } }
lc541反转字符串II
思路
循环中步长改为2k,每一次循环只翻转从起始位置起的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; 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); } }
卡码网54替换数字
思路
对于线性数据结构,填充或者删除,后序处理会高效的多
代码
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int len = s.length(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { len += 5; } } char[] ret = new char[len]; for (int i = 0; i < s.length(); i++) { ret[i] = s.charAt(i); } for (int i = s.length() - 1, j = len - 1; i >= 0; i--) { if ('0' <= ret[i] && ret[i] <= '9') { ret[j--] = 'r'; ret[j--] = 'e'; ret[j--] = 'b'; ret[j--] = 'm'; ret[j--] = 'u'; ret[j--] = 'n'; } else { ret[j--] = ret[i]; } } System.out.println(ret); } }