在之前刷力扣的过程中,我每刷道题都是先看题解然后再去边写边看,很多内容根本没消化,在进度上欺骗自己,感觉之前刷的都忘了,能力没有什么提升,现在还是一道都不会做。所以这次报了卡哥的算法训练营,希望能够按计划地有效刷题。本次刷题,我用的是 Java 语言解题,有余力的话也可能会加上 C++ 的题解。以下是算法训练营第八天的刷题记录和思考笔记。
s[left] ^= s[right]; // 构造 a ^ b 的结果,并放在 a 中 s[right] ^= s[left]; // 将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b s[left] ^= s[right]; // a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
三、541 反转字符串 II
题目
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
1 2
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
解题思路
在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。每隔 2k 个反转前 k 个,尾数不够 k 个时候全部反转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public String reverseStr(String s, int k) { char[] ch = s.toCharArray(); for (inti=0; i < ch.length; i += 2 * k) { intleft= i; intright= Math.min(ch.length - 1, left + k - 1); // 判断尾数够不够k个来决定end指针的位置 while (left < right) { chartemp= ch[left]; ch[left++] = ch[right]; ch[right--] = temp; } } returnnewString(ch); } }
classSolution { public String reverseLeftWords(String s, int n) { intlen= s.length(); StringBuildersb=newStringBuilder(s); reverseString(sb, 0, n - 1); reverseString(sb, n, len - 1); reverseString(sb, 0, len - 1); return sb.toString(); }
private StringBuilder reverseString(StringBuilder sb, int start, int end) { while (start < end) { chartemp= sb.charAt(start); sb.setCharAt(start++, sb.charAt(end)); sb.setCharAt(end--, temp); } return sb; } }