设双指针指向头尾,每次循环交换指针位置上的值,指针同时向中间移动一个,到头指针超过或者跟尾指针重合为止。
class Solution {
public void reverseString(char[] s) {
int i = 0, j = s.length-1;
while(i < j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
又被简单骗了555,又看了题解
其实不难,但是我怎么想不到那个反转函数的参数要那样设计呢。。
思路:把字符串转成字符数组,根据题意,反转2k的前k个字符(用到下面的reverse函数),用到min函数的原因是要考虑到最后一轮循环时剩余字符个数小于k的情况,最后再拼接起来。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
int len = ch.length;
for(int i = 0; i < len; i += 2*k){
reverse(ch, i, Math.min(i+k, len)-1);
}
return String.valueOf(ch);
}
//一个反转函数,思路可以看上面一题
public void reverse(char[] arr, int left, int right) {
while (left < right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
这题是这样直接调api吗?
class Solution {
public String replaceSpace(String s) {
return s.replace(" ", "%20");
}
}
哦,好像不是。
创建一个可以修改的字符串StringBuilder对象,分别添加不同的字符进去就好了。
哇,K神好强。
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
//对于数组中的每个元素判断是不是空格
for(char c : s.toCharArray()){
if(c == ' '){
//是就往sb添加%20
sb.append("%20");
}else{
//不是就添加原来字符
sb.append(c);
}
}
return sb.toString();
}
}
还有一种方法是先扩容数组,往数组里填数。
这个题写的有点复杂了。首先是用了trim()方法去掉首尾空格,再用split()切割字符串,这里是"\\s+"的原因是不确定每两个单词之间有几个空格(具体怎么写的参考正则表达式)。然后是一个普通的反转。最后用StringJoiner拼接。
import java.util.StringJoiner;
class Solution {
public String reverseWords(String s) {
s = s.trim();//去掉首尾空格
String[] split = s.split("\\s+");//按空格切割字符串
int len = split.length;
//交换单词位置
for(int i = 0; i < len/2; i++){
String temp = split[i];
split[i] = split[len-i-1];
split[len-i-1] = temp;
}
//重新拼接
StringJoiner result = new StringJoiner(" ");
for (String str : split) {
result = result.add(str);
}
return result.toString();
}
}
康康简单的调api怎么做:
class Solution {
public String reverseWords(String s) {
s = s.trim();//去掉首尾空格
List<String> list = Arrays.asList(s.split("\\s+"));//数组放到集合
Collections.reverse(list);//反转集合
return String.join(" ", list);//字符串链接
}
}
Arrays.asList()可以将数组转化成List集合。有几个小注意事项参考这篇文章~Arrays.asList() 详解_最小的帆也能远航的博客-CSDN博客
使用字符串的join()方法时,第二个参数可以是集合或者数组,或者是待拼接的字符串。
字符串在指定位置切割,再重新拼接:
class Solution {
public String reverseLeftWords(String s, int n) {
String sub1 = s.substring(0, n);
String sub2 = s.substring(n);
return sub2+sub1;
}
}
不用这个substring函数的话,可以把字符一个一个拿出来,再装到新的sb对象里去,也可以直接装到新的String对象里去。
但是后两种方法都比较慢,其中每次更新String是最慢的,因为每轮拼接新的字符,都会生成一个新的字符串,要申请一次内存。