目录
344.反转字符串
思路
反转字符串
541. 反转字符串II
思路
反转字符串||
剑指Offer 05.替换空格
思路
替换空格
方法一:
方法二(原地扩容,不适合java):
151.反转字符串里的单词
思路
反转字符串里的单词
剑指Offer58-II.左旋转字符串
思路
左旋转字符串
题目链接:力扣
遍历,用临时指针保存,进行替换
class Solution {
public void reverseString(char[] s) {
for (int i = 0 ; i < s.length/2 ; i++) {
char temp = s[i];
s[i] = s[s.length-1-i];
s[s.length-1-i] = temp;
}
}
}
题目链接:力扣
java中String类的对象是不可改变的,String类中每一个看起来会修改String值的方法,实际上都创建并返回了一个全新的String对象,所以String自身没有灵活的reverse()功能,StringBiuder倒是有,但是这个题目是每隔一段,部分进行反转,所以StringBiuder也不是很灵活
所以将String转换成字符数组进行操作,自定义reverse()方法
这里continue使用真的很绝,将满足一般情况的操作写在if判断中,即保证了每次有k个元素都可以处理,又保证了最后剩下的元素进行反转
第一步:将String转换成字符数组(好操作)
第二步:遍历数组,每2k个元素改变 i ,把没2k个字符看成一个整体
第三步:如果 i + k <= ch.length ,那说明这个2k整体元素是满的,那就进行反转
第四步:题目中的两个条件(1、剩下的不够k个全反转 2、剩下的不过2k个反转前k个),其实第2种情况在第三步的步骤中已经包含了
class Solution {
public String reverseStr(String s, int k) {
// 将字符串转换成字符数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += 2*k) {
// 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
// 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
if (i + k <= ch.length) {
reverse(ch , i, i+k-1);
continue;
}
// 如果剩余字符少于 k 个,则将剩余字符全部反转
reverse(ch , i , ch.length-1);
}
return new String(ch);
}
// 定义反转的函数
public void reverse(char[] ch , int i , int j) {
for ( ; i < j ; i++,j--) {
char tmep = ch[i];
ch[i] = ch[j];
ch[j] = tmep;
}
}
}
题目链接:力扣
一开始呢,考虑的是将字符串用空格分隔,然后再进行字符串的拼接,每拼接一个单词后就加上“%20”,但是有一种情况没通过,那就是一个字符串全都是空格,这种方法是不全面的
所以将每一个字符都拿出来,如果是空格就加成“%20”,这样就是把字符串转换成字符数组
最后发现,还是搞得有点复杂了,并不用转换成字符数组的,直接使用charAt()就可以的,这道题的整体思路还是比较简单的
在代码随想录中,提供了一个双指针的方法,这个方法适用于C++语言,但是不适用于java语言,因为java中的String对象是不可改变的,不能进行原地修改和扩容,但是思路确实很妙,空间复杂度是O(1),但是对java语言不适用
class Solution {
public String replaceSpace(String s) {
StringBuilder ss = new StringBuilder();
for (int i = 0 ; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
ss.append("%20");
} else {
ss.append(s.charAt(i));
}
}
return ss.toString();
}
}
// 摘自《代码随想录》网站
class Solution {
public String replaceSpace(String s) {
if(s == null || s.length() == 0){
return s;
}
//扩充空间,空格数量2倍
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '){
str.append(" ");
}
}
//若是没有空格直接返回
if(str.length() == 0){
return s;
}
//有空格情况 定义两个指针
int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
s += str.toString();
int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
char[] chars = s.toCharArray();
while(left>=0){
if(chars[left] == ' '){
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}else{
chars[right] = chars[left];
}
left--;
right--;
}
return new String(chars);
}
}
题目链接:力扣
题目中说,字符串中会出现前导空格和尾随空格的情况,所以我们首先将字符串前后的空格去掉,然后对整个字符串进行分割,如果每个单词之间只有一个空格,那分割出来的整个数组就只有单词,但是如果中间有多个空格,会分割出来空字符串
接下来对字符串进行重组,注意空字符串不要添加进去,注意不是空格,是空字符串
第一步:清空字符串两边的空格
第二步:使用空格字符串分割字符串(分割出来的数组元素有可能存在空字符串)
第三步:进行判断,从数组后面一个元素往后添加
class Solution {
public String reverseWords(String s) {
s = s.trim();
StringBuilder sb = new StringBuilder();
String[] ss = s.split(" ");
for (int i = ss.length - 1; i > 0; i--) {
if (!ss[i].equals("")) {
sb.append(ss[i]);
sb.append(" ");
}
}
sb.append(ss[0]);
return sb.toString();
}
}
题目链接:力扣
前面部分要移动到后面,那就创建一个空字符串,先添加后面的,再添加前面的就可以
class Solution {
public String reverseLeftWords(String s, int n) {
// 定义一个接收字符串
StringBuilder sb = new StringBuilder();
// 先添加后面的字符
for (int i = n; i < s.length(); i++) {
sb.append(s.charAt(i));
}
for (int i = 0; i < n; i++) {
sb.append(s.charAt(i));
}
return sb.toString();
}
}