代码随想录刷题——day8\9

52 阅读3分钟

344.反转字符串

本题具体位置:344.反转字符串

思路:

  • 题目给定的输入是一个字符串数组,所以使用双指针来首尾两两交换,达到反转的目的;

具体代码为:

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

这里有一个要特别注意的点:

  • 我个人想当然地以为了在Java的Arrays库函数中给了reverse的方法,但是通过查询API文档,Arrays中没有给反转相关的方法!!!

  • Collections中给了一个反转的静态方法,Collections.reverse() ;用于反转列表中的元素,但是只能适用于列表,如Arraylist

541. 反转字符串II

题目具体位置:541. 反转字符串II

思路:

有以下要注意的点!!!

  • Java中String是原始数据类型,它是不可变的——即不能直接更改字符串中的字符,尝试更改的话会导致编译错误。

  • 所以可以尝试将String 转换成字符数组, 如char[] ch=s.toCharArray();

  • 如若要将字符数组转换成String,可调用String的构造函数 String s=new String(ch);

微信图片_20240202160114.jpg

具体代码如下:

class Solution {
        public String reverseStr(String s, int k) {
            //Java中String类型不可变,故先将其转成字符数组
            char[] ch=s.toCharArray();
            //获取字母的实际个数
            int letterNum=ch.length;
            //计算需要循环的个数
            int group=letterNum/(2*k);
            boolean flag=false;
            //如果剩余字符少于k个,则额外处理
            if(letterNum%(2*k)<k){
                flag=true;
            }
            else{
                group++;
            }
            //循环,交换对应位置上的字母
            for(int i=0;i<group;i++){
                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--;
                }
            }
            //前面最初始已经判断过,如果确实需要额外处理
            //将剩余少于k个的字母完成交换
            if(flag){
                int left=group*2*k;
                int right=ch.length-1;
                while(left<right){
                    char temp=ch[left];
                    ch[left]=ch[right];
                    ch[right]=temp;
                    left++;
                    right--;
                }
            }
            return new String(ch);
        }
    }

看了其他解法之后,对自己的代码略作修改,提高高效性,将需要独立出来运行的那个“剩余小于k个的字母反转”一起揉进去

 class Solution {
        public String reverseStr(String s, int k) {
            char[] ch = s.toCharArray();
            for(int i = 0;i < ch.length;i += 2 * k){
                int left= i;
                // 判断尾数够不够k个来取决end指针的位置
                int right= Math.min(ch.length - 1,left+ k - 1);
                while(left< right){

                    char temp = ch[left];
                    ch[left] = ch[right];
                    ch[right] = temp;

                    left++;
                    right--;
                }
            }
            return new String(ch);
        }
    }

151.翻转字符串里的单词

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

这里顺带熟悉一下Java中关于String的一些库函数:

微信图片_20240202230759.jpg

class Solution {
        public String reverseWords(String s) {
            //将s转化为数组,首先将s的前后空格都给去掉,再调用库函数split,
            String[] s1=s.trim().split(" ");
            StringBuffer result=new StringBuffer();
            //从后往前遍历数组s1 
            for(int i=s1.length-1;i>=0;i--){
                //因为前面已经将s的前后空格都给去掉了,这里主要讨论各“单词”之间的多个空格
                //如果各个单词之间有多个空格,调用split()方法,数组中就会出现""这种东西。
                if(s1[i]!=""){
                    result.append(s1[i]);
                    result.append(" ");
                }
            }
            return result.toString().trim();
        }
    }

KMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMP!!!! 没有产出