代码随想录第八天 | Leetcode 344 反转字符串 、Leetcode 541 反转字符串II、卡码网 54 替换数字 、Leetcode 151 翻转字符串里单词、卡码网 55 右旋转字符串

目录

Leetcode 344 反转字符串

Leetcode 541 反转字符串II

卡码网 54 替换数字

Leetcode 151 翻转字符串里单词

卡码网 55 右旋转字符串


Leetcode 344 反转字符串

题目链接:Leetcode 反转字符串

文档讲解:代码随想录 反转字符串

视频讲解:b站视频

第一想法:用双指针法,设置头尾两个指针,交换头尾两个指针的内容,然后两个指针向中间移动,直到相交为止。(和代码随想录提供的想法大差不差)

class Solution {
    public void reverseString(char[] s) {
        int left=0;
        int right=s.length-1;
        while(left<right){
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }
}

Leetcode 541 反转字符串II

题目链接:Leetcode 反转字符串II

文档讲解:代码随想录 反转字符串II

视频讲解:b站视频

在Java中s.toCharArray()函数可以将字符串s,转换成为一个char数组。

第一想法:又是一道自己可以写出来的题,虽然有点复杂。将字符串按长度2k进行分组,除了最后一组外,其它的组处理方式相同,均是找到改组中第一个数字和第k个数字,然后利用双指针进行交换;最后一组分情况讨论,如果剩余数字个数小于k(最后一组为2k个数的情况在此处做取模操作后余数为0也要排除这种情况),其余是另外一种情况。

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        int iter_times = (int)Math.ceil((double)(ch.length)/(2*k));
        for(int i=0; i<iter_times; i++){
            if(i != iter_times-1){   //先是对除了最后一组外的其它组别进行交换操作
                int left = i*2*k;
                int right = left+k-1;
                while(left<right){
                    char temp = ch[left];
                    ch[left] = ch[right];
                    ch[right] = temp;
                    left++;
                    right--;
                }
            }
            else{
                int leave_num = (ch.length)%(2*k);
                if(leave_num<k && leave_num!=0){  //当最后一组剩余数字个数小于k时的操作,要注意leave_num=0的情况,这种情况说明改组别中有四个数字
                    int left = i*2*k;
                    int right = ch.length-1;
                    while(left<right){
                        char temp = ch[left];
                        ch[left] = ch[right];
                        ch[right] = temp;
                        left++;
                        right--;
                    }
                }
                else{
                    int left = i*2*k;
                    int right = left+k-1;
                    while(left<right){
                        char temp = ch[left];
                        ch[left] = ch[right];
                        ch[right] = temp;
                        left++;
                        right--;
                    }
                }
            }
        }
        return new String(ch);
    }
}

学习记录:

我自己写的分类太多了,其实只要每次将i移动2k个位置,然后判断其中双指针交换法的起点和终点位置即可。另外交换的部分不用重复写,判断好双指针的起始位置后,交换的过程是一样的。

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i<ch.length; i=i+2*k){
            int left = i;
            int right = 0;
            if(ch.length<i+k){     //组中所有内容均需交换
                right = ch.length-1;
            }
            else{
                right = left+k-1;
            }
             while(left<right){
                    char temp = ch[left];
                    ch[left] = ch[right];
                    ch[right] = temp;
                    left++;
                    right--;
                }
        }
        return new String(ch);
    }
}

卡码网 54 替换数字

题目链接:卡码网 替换数字

文档讲解:代码随想录 替换数字

第一想法:创建一个新的字符串记录结果,因为长度发生了变化,当前字符串从前往后遍历,如果是数字就替换成number。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in); // 创建Scanner对象并传入标准输入流(键盘)作为参数
        
        String s = scanner.next(); // 通过调用scanner的next()方法获取输入的字符串,然后再通过charAt(0)方法提取第一个字符
        char[] ch = s.toCharArray();
        
        int num_c = 0;
        for(char i:ch) {
        	if(i<='9' && i>='0') {
        		num_c++;
        	}
        }
        
        char[] res = new char[5*num_c+s.length()];
        int j=0;
        for(int i = 0; i<ch.length;i++) {
        	if(ch[i]<='9' && ch[i]>='0') {
        		res[j]='n';
        		res[j+1]='u';
        		res[j+2]='m';
        		res[j+3]='b';
        		res[j+4]='e';
        		res[j+5]='r';
        		j=j+6;
        	}
        	else {
        		res[j]=ch[i];
        		j++;
        	}
        }
        
        String f = new String(res);
        System.out.print(f);
	}
}

学习记录:

        关键在于要从后往前填充,可以降低时间复杂度,因为从前往后的话,还要移动之后的内容,为当前的替换内容留出空间(在不创建新数组的情况下)。Java数组是定长的,必须创建一个新数组。


Leetcode 151 翻转字符串里单词

题目链接:Leetcode 翻转字符串里的单词

文档讲解:代码随想录 翻转字符串里的单词

视频讲解:b站视频

第一想法:没什么想法

学习记录:

妙啊!先翻转整个字符串,然后将每个单词的内容进行翻转就得到了目标内容。另外还要考虑删除多余的空格的问题。

class Solution {
    public String reverseWords(String s) {
        char[] ch = s.toCharArray();
        //1.首先去除多余的空格
        ch = remove_eSpace(ch);
        //2.翻转整个字符串
        ch = reverseCh(ch,0,ch.length-1);
        //3.翻转每个单词
        ch = reverseWord(ch);
        return new String(ch);
    }
    public char[] remove_eSpace(char[] ch){
        int slow = 0;
        for(int fast = 0; fast<ch.length; fast++){
            if(ch[fast] !=' '){
                if(slow!=0){  //要在while前,防止出现末尾的空格没删除的情况
                    ch[slow] = ' ';
                    slow++;
                }
                while(fast<ch.length && ch[fast]!=' '){
                    ch[slow] = ch[fast];
                    slow++;
                    fast++;
                }  
            }   
        }
        char[] newch = new char[slow];
        System.arraycopy(ch, 0, newch, 0, slow); 
        return newch;
    }

    public char[] reverseCh(char[] ch, int start, int end){
        while(start<end){
            char temp = ch[start];
            ch[start] = ch[end];
            ch[end] = temp;
            start++;
            end--;
        }
        return ch;
    }

    public char[] reverseWord(char[] ch){
        int start = 0;
        for(int end = 0; end<ch.length; end++){
            while(end<ch.length && ch[end]!=' '){
                end++;
            }
            ch = reverseCh(ch,start,end-1);
            start = end+1;
        }
        return ch;
    }
}

 卡码网 55 右旋转字符串

题目链接:卡码网 右旋转字符串

文档讲解:代码随想录 右旋字符串

第一想法:找到要移动的字符起始位置及其前一个位置,用temp存储当前位置的内容,然后把前面的字符从后往前依次后移一个位置。

学习记录:

妙啊,可以引入字符串翻转,先翻转整个字符串,然后翻转前一部分,以及后一部分,得到目标字符串。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in); // 创建Scanner对象并传入标准输入流(键盘)作为参数
		int num = Integer.parseInt(scanner.nextLine());
		String s = scanner.nextLine();
		char[] ch = s.toCharArray();
		ch = re_ch(ch,0,ch.length-1);
		ch = re_ch(ch,0,num-1);
		ch = re_ch(ch,num,ch.length-1);
		String f = new String(ch);
		System.out.print(f);
	}
	public static char[] re_ch(char[] ch, int start, int end) {
		while(start<end){
            char temp = ch[start];
            ch[start] = ch[end];
            ch[end] = temp;
            start++;
            end--;
        }
        return ch;
	}
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值