编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路:不分配额外空间,那么首选双指针,头尾互相交换,然后向中间靠拢
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
char []temp = new char[1];
while (left < right){
temp[0] = s[left];
s[left] = s[right];
s[right] = temp[0];
++left;
--right;
}
}
}
这道题基于上一道的 延伸,多了两个条件,一个是按2k长度的数组元素转换,另一个是剩余字符小于 2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。
首先我们肯定要写出翻转的函数,而且需要确定他左右边界
精彩的地方在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
class Solution {
public String reverseStr(String s, int k) {
int len = s.length();
char[] ch = s.toCharArray();
//每隔 2k 个字符的前 k 个字符进行反转
for (int i = 0; i< ch.length; i += 2 * k){
if( i + k <= len ){
reverseString(ch, i, i+k-1);
continue;
}
reverseString(ch , i, len - 1);
}
return new String(ch);
}
public void reverseString(char[] s,int left,int right){
char []temp = new char[1];
while(left < right){
temp[0] = s[left];
s[left] = s[right];
s[right] = temp[0];
++left;
--right;
}
}
}
这道题没有难度,直接上代码
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for(char alpha : s.toCharArray()){
if(alpha == ' '){
sb.append("%20");
}else{
sb.append(alpha);
}
}
return sb.toString();
}
}
第一种方法是调用库函数,这里用tirm来返回字符串删除前导和尾随空格的副本
AsList 可以将一个变长参数或者数组转换成List
Collections.reverse: 对List集合进行降序排序
class Solution {
public String reverseWords(String s) {
String[] words = s.trim().split(" +");
//split(" +") 是正则表达式写法,表示至少一个空格,如果有多个空格就以多个空格切分
Collections.reverse(Arrays.asList(words));
//Collections.reverse对list集合进行降序排序
return String.join(" ", words);
}
}
方法二: 1:去除首尾空格(可以直接.trim())
2: 反转整个字符串
3:反转各个单词
class Solution {
public String reverseLeftWords(String s, int n) {
int len=s.length();
StringBuilder sb=new StringBuilder(s);
reverseString(sb,0,n-1);
reverseString(sb,n,len-1);
return sb.reverse().toString();
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
}
StringBuilder setCharAt(int index, char ch): 方法用于设置作为ch传递的位置索引处的字符。
总结
1 讲到反转一个字符串应该怎么做,在不开辟新内存的情况下使用了双指针法。
2 给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
3 要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 。
4 向左翻转字符是先局部反转再 整体反转