344.反转字符串同541
541.反转字符串2
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”
思路:基本思路有,找到前k个字符,然后进行反转,写的过程中出现了两个错误,一个是直接交换了下边,left right根本没用,另外一个是把temp的类型习惯性的写成了int。
注意字符数组和字符串相互转化的两个API。
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i += 2*k){
int left = i;
int right = Math.min(i + k -1, ch.length - 1);
while(left < right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
剑指offer05 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = “We are happy.”
输出:“We%20are%20happy.”
java的两个方法都需要用到StringBuilder,个人感觉两个方法没有很大不同,甚至说用双指针反而更麻烦了。但都把两种代码写一下吧。
class Solution {
public String replaceSpace(String s) {
StringBuilder str = new StringBuilder();
for(int i = 0; i < s.length(); i ++){
if(s.charAt(i) == ' '){
str.append("%20");
}else{
str.append(s.charAt(i));
}
}
return str.toString();
}
}
第二种方法注意两个指针的赋值。
class Solution {
public String replaceSpace(String s) {
StringBuilder str = new StringBuilder();
for(int i = 0; i < s.length(); i ++){
if(s.charAt(i) == ' '){
str.append(" ");
}
}
int left = s.length() - 1;
s+=str.toString();
int right = s.length() - 1;
char[] ch = s.toCharArray();
while(left >= 0){
if(ch[left] == ' '){
ch[right--] = '0';
ch[right--] = '2';
ch[right] = '%';
}else{
ch[right] = ch[left];
}
left--;
right--;
}
return new String(ch);
}
}
offer58反转前k个,思路很新。
分别反转前几个和后几个,最后整个反转,就是左旋。
一遍写对啦!
class Solution {
public String reverseLeftWords(String s, int n) {
char[] c = s.toCharArray();
reverse(c, 0, n - 1);
reverse(c, n, c.length - 1);
reverse(c, 0, c.length - 1);
return new String(c);
}
public void reverse(char[] c, int left, int right){
while(left < right){
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
}
}