代码随想录算法训练营第42期 第八天| 344.反转字符串 、541. 反转字符串II、卡码网:54.替换数字

一、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,再变回去就行了

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值