一、344.反转字符串
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s
的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
学习链接:反转字符串状态:做出来了
时间复杂度:O(n) 空间复杂度:O(1)
细节之处:1 (代码里面)
思路:因为要原地修改,其实就可以想到双指针,left从左,right从右,每一步left和right位置交换就行了
class Solution {
public void reverseString(char[] s) {
int left=0;int right=s.length-1;
while(left<=right){ //1 这里要<=,因为最后一个位置也需要存放
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
}
二、541. 反转字符串II
题目:给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。学习链接:替换数字
状态:做出来了
我的思路: 时间复杂度:O(n) 空间复杂度:O(n)
正确思路: 时间复杂度:O(n) 空间复杂度:O(n)
思路:这道题我写的惨不忍睹,代码比较长。我的思路是 双指针,right++一直到达数组的尽头,分三种情况:第一种情况:right-left==2*k,交换[left,left+10],后k个照放。第二种情况:right到达数组尽头,k<=right-left<=2k,前k个反转,right-k反转。第三种情况:right到达数组的尽头,right-left<k,直接反转。正确思路应该分俩个指针,for循环遍历,i+2*kstart和end,end指向反转的最后的字符,start代表反转的第一个字符.然后反转就行了。
我的思路:
class Solution {
public String reverseStr(String s, int k) {
int left=0;int right=0;
String result="";
while(right<s.length()){
if(right-left==2*k){
String temp =s.substring(left,left+k);
temp=new StringBuffer(temp).reverse().toString();
result+=temp;
temp=s.substring(left+k,right);
result+=temp;
}
if(right-left>=k&&right-left<2*k&&right==s.length()-1){
String temp=s.substring(left,left+k);
temp=new StringBuffer(temp).reverse().toString();
result+=temp;
temp=s.substring(left+k,right+1);
result+=temp;
return result;
}
if(right-left<k&&right==s.length()-1){
String temp=s.substring(left,right+1);
temp=new StringBuffer(temp).reverse().toString();
result+=temp;
return result;
}
right++;
}
return result;
}
}
正确思路:
class Solution {
public String reverseStr(String s, int k) {
char[] ch=s.toCharArray();
for(int i=0;i<s.length();i+=2*k){
int start=i;
int end=Math.min(start+k-1,s.length()-1);
while(start <= end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
三、卡码网:54.替换数字
题目:
学习链接:替换数字状态:做出来了
时间复杂度:O(n) 空间复杂度:O(n)
思路:其实这道题针对java挺容易的,因为Java的string不能原地修改 ,所以Java无需用到从后向前遍历的思想,遇到数字,直接加number就行了。
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
String result="";
for(int i=0;i<s.length();i++){
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
result+="number";
continue;
}
result+=s.charAt(i);
}
System.out.println(result);
}
}
四、总结
Java中的string不能修改,所以得新new个对象,如果要使用reverse等常见api方法可以使用StringBuffer类型的,最后toString,再变回去就行了