题目链接:344. 反转字符串 - 力扣(LeetCode)
初见思路:想法很简单,就是通过获取char[]的长度,原地进行交换即可
ac代码如下:
class Solution {
public void reverseString(char[] s) {
int length = s.length;
for(int i = 0; i < s.length / 2;i++){
char tmp = s[i];
s[i] = s[length-i-1];
s[length - i - 1] = tmp;
}
}
}
题目链接:541. 反转字符串 II - 力扣(LeetCode)
思路:简单的进行模拟就好,但要注意:
Java中 String属于引用数据类型,他是不可变的→即从出生到死亡都是不能够改变的
因此本题中我们需要使用StringBuffer对变化后的字符串进行存储
StringBuffer支持动态对字符串进行增删操作
同时本题中用到了许多的String操作,读者若不明白其中原理可自行查阅相关内容
本题就是简单的模拟,笔者在第一次书写时对字符串中的内容进行了修改,发现这是并不可行的,我们应当使用StringBuffer来进行相关操作,具体思路为:
- 定义 start、 firstk 以及 secondk 来每次寻找其相关位置,同时对于firstk、 secondk的值判断其是否超出长度
- 定义两个StringBuffer对象,用来保存我们修改后的相关字符串
- 每次操作后,令start直接+=2k以减少操作
- 具体的字符串添加使用 String.substring() 以及 StringBuffer.append()进行
具体ac代码如下:
class Solution {
public String reverseStr(String s, int k) {
StringBuffer res = new StringBuffer();
int length = s.length();
int start = 0;
while(start < length){
StringBuffer temp = new StringBuffer();
int firstK = ( start + k > length)?length:start+k;
int secondK = (start + (2 * k) > length)?length:start+(2*k);
temp.append(s.substring(start,firstK));
res.append(temp.reverse());
if(firstK < secondK){
res.append(s.substring(firstK,secondK));
}
start+=(2*k);
}
return res.toString();
}
}
题目链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
初见思路:想法很简单,直接遍历整个字符串,遇到空格则在StringBuffer中添加空格前的字符串,并添加所要求的字符串,继续便可。最终添加未加入StringBuffer中的字符串
ac代码如下:
class Solution {
public String replaceSpace(String s) {
StringBuffer res = new StringBuffer();
int temp = 0;
for(int i = 0; i < s.length();i++){
if(s.charAt(i) == ' '){
res.append(s.substring(temp,i));
res.append("%20");
temp = i+1;
}
}
res.append(s.substring(temp));
return res.toString();
}
}
同样也可使用双指针法来求解此道问题,为字符串添加2 * 空格数 个空间 ,其次让一个指针指向旧的字符串长度,另一个指向新字符串的长度,由后向前进行遍历,当旧指针指向空格时,新指针进行%20的替换,直至两个指针位置相同时结束遍历;
由于在Java中,String是引用型变量,其内部不可更改,因此我们不可避免的要使用额外的空间,故此题使用两种方法的空间复杂度是相同的,读者可自行书写双指针代码,笔者此处就不赘述了。
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
思路就是很简单的几点:
- 首先定义一个flag变量以去除字符串前的空格
- 发现空格时,若下一个不是空格则保存,否则不保存
以上两点就完成了对多余空格的删除,并将其保存到了一个新的字符串中,其次就要进行字符串中单词的反转了
- 定义temp以保存单词结束位置,由后向前进行遍历,当发现空格时将整个单词加入新的字符串中,并加上空格
- return新的字符串
先保存下,虽然不对
class Solution {
public String reverseWords(String s) {
StringBuffer res = new StringBuffer();
int temp = 0;
boolean flag = false;
//完成对前导空格和多余空格的去除
for(int i = 0; i < s.length();i++){
if(!flag){
continue;
}
if(s.charAt(i) != ' '){
flag = true;
}
if(flag){
if(s.charAt(i) != ' '){
res.append(s.charAt(i));
}
while(s.charAt(i) == ' '){
if(s.charAt(i+1)!=' '){
res.append(s.charAt(i));
}
else i++;
}
}
}
return res.toString();d
StringBuffer end = new StringBuffer();
temp = res.length();
for(int i = res.length()-1;i > 0;i--){
if(res.charAt(i) == ' '){
end.append(res.substring(i+1,temp));
temp = i;
}
}
end.append(res.substring(0,temp));
return end.toString();
}
}
问题出在两个方面:
- 应该首先进行flag的修改,其次再进行判断相关的操作
- 不该在循环中修改i的值
- 没有给end中添加空格
修改后的ac代码:
**class Solution {
public String reverseWords(String s) {
StringBuffer res = new StringBuffer();
int temp = 0;
boolean flag = false;
//完成对前导空格和多余空格的去除
for(int i = 0; i < s.length();i++){
if(s.charAt(i) != ' '){
flag = true;
}
if(!flag){
continue;
}
else{
if(s.charAt(i) != ' '){
res.append(s.charAt(i));
}
else if(s.charAt(i) == ' '){
if((i+1) < s.length() && s.charAt(i+1) !=' '){
res.append(s.charAt(i));
}
else continue;
}
}
}
StringBuffer end = new StringBuffer();
temp = res.length();
for(int i = res.length()-1;i > 0;i--){
if(res.charAt(i) == ' '){
end.append(res.substring(i+1,temp));
end.append(" ");
temp = i;
}
}
end.append(res.substring(0,temp));
return end.toString();
}
}**
题目链接:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)
没啥好说的,java必然有内存的消耗
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuffer res = new StringBuffer();
for(int i = n; i < s.length();i++){
res.append(s.charAt(i));
}
res.append(s.substring(0,n));
return res.toString();
}
}