1.题目
2. 代码
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);//关键一步 判断尾数够不够k个来取决end指针的位置
while(start<end){
char temp=ch[start];
ch[start]=ch[end];
ch[end]=temp;
start++;
end--;
}
}
return new String(ch);
}
}
3. 解法思想
题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转。其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
本题中需要注意的是new String(数组)的用法:把数组转化为字符串
ch.toString()方法返回此对象本身
例题如下所示:
package test;
import util.DBUtil;
import entity.Entity;
public class test1 {
public static void main(String[] args) {
char[] data = {'a', 'b', 'c'};
String str1 = data.toString();
String str2 = new String(data);
String str3 = str2.toString();
System.out.println("str1 = "+str1);
System.out.println("str2 = "+str2);
System.out.println("str3 = "+str3);
}
}
str1 = [C@139a55
str2 = abc
str3 = abc
本体还可以延伸到String与new String()的区别
1、String str = “test”;
以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象,如果存在,直接把实例池中"test"的地址返回给str。如果不存在,则会在实例池中创建"test"对象,并把该对象的地址返回给str。
所以通过==比较是,str1,str2指向的是同一地址,所以返回true;
2、String str = new String(“test”);
以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象,若不存在则会在实例池中创建"test"对象,同时在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。若实例池存在则直接在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。
这时str1和str2分别指向堆中不同的地址,所以返回false;