IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode刷题 第七天 -> 正文阅读

[数据结构与算法]LeetCode刷题 第七天

LeetCode 344

  1. 看到题目的第一想法
    使用双指针的方式,交换前后字符即可
  2. 看完题解后的想法
    采用双指针
class Solution {
    public void reverseString(char[] s) {
        for(int i=0,j=s.length-1;i<j;i++,j--){
            char temp=s[i];
            s[i]=s[j];
            s[j]=temp;
        }
    }
}
  1. 遇到的困难

LeetCode 541

  1. 看到题目的第一想法
    对不同的类型分别进行处理,首先剥离出一个翻转字符串的函数,然后分别对前2K的前K个进行翻转,大于k的翻转不足2K,翻转前k,不足k的,全部翻转,这样的话条件变复杂
  2. 看完题解后的想法
    每次向前遍历的时候不要挨个挨个遍历,可以直接跳跃2k,然后判断前k翻转,之后不足k的到尾部了,全部翻转即可
class Solution {
    public void reverSubString(char[] arr, int start, int end){
        for(int i=start,j=end;i<j;i++,j--){
            char temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
        }
    }
    public String reverseStr(String s, int k) {
        char[] c = s.toCharArray();
        for(int i=0;i<s.length();i+=(2*k)){
            if(i+k<=s.length()){
                reverSubString(c,i,i+k-1);
                continue;
            }
            reverSubString(c,i,c.length-1); //不足k
        }
        return new String(c);
    }
}
  1. 遇到的困难
    每次向前翻转2K个,并且不足k的时候说明到字符串末尾,然后这时候直接执行后面的语句即可,之前的只要大于k的就翻转前k个即可。

LeetCode 剑指05

  1. 看到题目的第一想法
    重新定义一个新的数组,因为每次都要进行替换,也就是长度要加2,因为多余了两个。然后再判断的时候如果等于‘ ’就替换,不等于就直接赋值,这样的做法首先定义了一个多余的存储空间。
class Solution {
    public String replaceSpace(String s) {
        char[] arr=s.toCharArray();
        int lengthArr=arr.length;
        for(int i=0;i<arr.length;i++){
            if(arr[i]==' '){
                lengthArr+=2;
            }
        }
        char[] result=new char[lengthArr];
        for(int i=result.length-1,j=arr.length-1;j<i;i--,j--){
            if(arr[j]!=' '){
                result[i]=arr[j];
            }else{
                result[i--]='0';
                result[i--]='2';
                result[i]='%';
            }
        }
        return new String(result);
    }
}
  1. 看完题解后的想法
    用思路是一样的,都是从后往前赋值,这样避免了从前往后造成的依次往后排,但是这里使用的是StringBuilder,并且,如果出现了‘ ’,然后Stringbuilder加上了两个空格,然后把这两个空格转成字符串并添加到原来字符串的后面,这样相当于还是在原来的字符串上进行操作。类似于
"I am"
"I am  "
    | |
    i j
class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                sb.append("  ");
            }
        }
        int oldlength=s.length();
        s+=sb.toString();
        char[] arr=s.toCharArray();
        for(int i=oldlength-1,j=arr.length-1;i<j;i--,j--){
            if(arr[i]!=' '){
                arr[j]=arr[i];
            }else{
                arr[j--]='0';
                arr[j--]='2';
                arr[j]='%';
            }
        }
        return new String(arr);
    }
}
  1. 遇到的困难
    StringBuilder使用来添加两个空格字符串,并且要想到在同一个字符数组上操作。

LeetCode 151

  1. 看到题目的第一想法
    一个是去除多余的空格,然后翻转这个字符串,再针对每个单词进行翻转。但是这里对于空格去除不清楚
class Solution {
    public String reverseWords(String s) {
        char[] arr=s.toCharArray();
        String s1=minusSpaces(arr);

    }
    public String minusSpaces(char[] arr){
        int count=arr.length;
        for(int i=0,j=arr.length-1;i<j;i++,j--){
            while(arr[i]==' ' || arr[j]==' '){
                count--;
            }
        }
    }
    public void reverseStr(char[] arr, int start, int end){
        for(int i=start,j=end;i<j;i++,j--){
            char temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
        }
    }
}
  1. 看完题解后的想法
    思路上一样,对于空格的去除可以使用双指针的方式,去除所有空格,然后给每一个单词后分别加上空格。(参考数组部分的去除元素),然后在翻转每一个单词的时候注意,遇到空格翻转空格之前的,然后把Start指针放到空格后第一个。
class Solution {
    public char[] removeSpace(char[] chars) {
        int slow = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            //先用 fast 移除所有空格
            if (chars[fast] != ' ') {
                //在用 slow 加空格。 除第一个单词外,单词末尾要加空格
                if (slow != 0)
                    chars[slow++] = ' ';
                //fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了
                while (fast < chars.length && chars[fast] != ' ')
                    chars[slow++] = chars[fast++];
            }
        }
        //相当于 c++ 里的 resize()
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow); 
        return newChars;
    }
    public void reversestr(char[] a,int start, int end){
        for(int i=start,j=end;i<j;i++,j--){
            char c=a[i];
            a[i]=a[j];
            a[j]=c;
        }
    }
    public void reverseEachWord(char[] chars) {
        int start = 0;
        //end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置
        for (int end = 0; end <= chars.length; end++) {
            // end 每次到单词末尾后的空格或串尾,开始反转单词
            if (end == chars.length || chars[end] == ' ') {
                reversestr(chars, start, end - 1);
                start = end + 1;
            }
        }
    }
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();
        char[] result = removeSpace(arr);
        reversestr(result,0,result.length-1);
        reverseEachWord(result);
        return new String(result);
    }
}
  1. 遇到的困难
    去除空格操作不清楚

LeetCode 剑指58

  1. 看到题目的第一想法
    把前面的n个元素添加到末尾,然后去除前面n个元素重新开始并把这个字符串返回。
class Solution {
    public String reverseLeftWords(String s, int n) {
        if(s=="" || n==0){
            return s;
        }
        StringBuilder sb = new StringBuilder();
        StringBuilder sb1 = new StringBuilder();
        sb.append(s);
        int i=0;
        for(;i<n;i++){
            sb.append(s.charAt(i));
        }
        String s1=sb.toString();
        for(;i<s1.length();i++){
            sb1.append(s1.charAt(i));
        }
        return sb1.toString();
    }
}
  1. 看完题解后的想法
    在这里插入图片描述
    先翻转前n个,然后翻转剩下的,最后翻转整体的就是我们想要的结果
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder();
        sb.append(s);
        revereStr(sb,0,n-1);
        revereStr(sb,n,s.length()-1);
        revereStr(sb,0,s.length()-1);
        return sb.toString();
    }
    //这里要用StringBuilder来接收不能使用String
    public void revereStr(StringBuilder sb, int start, int end){
        for(int i=start,j=end;i<j;i++,j--){
            char temp=sb.charAt(i);
            sb.setCharAt(i,sb.charAt(j));//注意这里交换要用setCharAt不能直接用charAt去进行交换,因为获取的是常数不是变量
            sb.setCharAt(j,temp);
        }
    }
}
  1. 遇到的困难
    无。对于题解中的解法不太能想得到,但是题解中的交换字符串中的两个字符应该要熟悉。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:10  更:2022-10-31 12:26:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:50:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码