344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-string
一个指针l指向字符串第一个字符,另一个指针r指向字符串最后一个字符,两个指针所在位置的数组元素交换,l向右走l++,r向左走r--,当l>=r时,字符串反转完成
public void reverseString(char[] s) {
int l=0,r=s.length-1;
while(l<r) {
char ch=s[l];
s[l]=s[r];
s[r]=ch;
l++;r--;
}
}
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-string-ii
使用变量i遍历字符串,每次遍历结束i+2k,判断如果i大于字符串长度,退出;如果i+k>长度len,反转[i,len)之间的字符;否则反转[i,i+k)之间的字符。
public String reverseStr(String s, int k) {
int i=0,len=s.length();
char[]chs=s.toCharArray();
while(i<len) {
if(i+k>len) {
reverse(chs,i,len-1);break;
}else{
reverse(chs,i,i+k-1);
i+=2*k;
}
}
return new String(chs);
}
void reverse(char[]chs,int start,int end) {
while(start<end) {
char ch=chs[start];
chs[start]=chs[end];
chs[end]=ch;
start++;end--;
}
}
剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
统计字符串中空格的数量count,字符串长度添加2*count,一个指针l指向旧字符串的最后一个字符,另一个指针r指向添加长度后的新字符串的最后一个字符,当l是空格时,r依次赋值0,2,%,r--,l--;当l不为空格时,把l指向的字符赋值给r,l--,r--,当l==0,空格替换完成。
public String replaceSpace(String s) {
StringBuilder sb=new StringBuilder();
for(char ch:s.toCharArray()) {
if(ch==' ')sb.append(" ");
}
if(sb.length()==0) return s;
s=s+sb.toString();
char chs[]=s.toCharArray();
int l=s.length()-sb.length()-1,r=s.length()-1;
while(l>=0&&r>=0) {
if(chs[l]!=' ') {
chs[r]=chs[l];
}else {
chs[r--]='0';
chs[r--]='2';
chs[r]='%';
}
l--;r--;
}
return new String(chs);
151.翻转字符串里的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-words-in-a-string
先去除多余的空格,start记录字符串第一个不为空格的字符的下标,end记录字符串最后一个不为空格的字符的下标,sb记录去除多余空格的字符串,遍历字符串从start到end的字符,如果当前字符不是空格或者sb的最后一个字符不是空格,sb字符串加上start字符,直到start=end;
然后整个字符串反转,使用stringbuilder的reverse函数;再反转单词,start=0,end=1,如果end下标字符不等于空格,end++,如果为空格,反转[start,end)之间的字符串,反转后start更新为end+1,end更新为start+1.
public String reverseWords(String s) {
//去掉多余空格
int start=0,end=s.length()-1;
while(s.charAt(start)==' ')start++;
while(s.charAt(end)==' ')end--;
StringBuilder sb=new StringBuilder();
while(start<=end) {
char ch_start=s.charAt(start);
//如果当前字符不是空格或者新的字符串后面没有空格,添加当前字符到新字符串末尾
if(ch_start!=' '||sb.charAt(sb.length()-1)!=' ')
sb.append(ch_start);
start++;
}
//整个字符串反转
sb=sb.reverse();
//单词反转
start=0;
end=start+1;
while(start<end&&start<sb.length()) {
while(end<sb.length()&&sb.charAt(end)!=' ') {
end++;
}
//反转单词
//System.out.println(start+","+end);
reverse(sb,start,end-1);
start=end+1;
end=start+1;
}
return sb.toString();
}
void reverse(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--;
}
}
剑指Offer58-II.左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
先反转前k个字符,再反转k到最后一个字符,然后整个字符串反转,得到左旋转k位的字符串。
public String reverseLeftWords(String s, int n) {
char[] chs=s.toCharArray();
reserve(chs,0,n-1);
reserve(chs,n,chs.length-1);
reserve(chs,0,chs.length-1);
return new String(chs);
}
void reserve(char[]chs,int l,int r) {
while(l<r) {
char t=chs[l];
chs[l]=chs[r];
chs[r]=t;
l++;r--;
}
}