「日更刷题」第一周,链表和哈希表(三)

简介: 「日更刷题」第一周,链表和哈希表

剑指Offer58-II.左旋转字符串

题目描述

网络异常,图片无法展示
|

解题思路

  • 反转 0-n
  • 反转 n-length
  • 反转 0-length

代码展示

public String reverseLeftWords(String s, int n) {
        char[] chars = s.toCharArray();
        int length = chars.length;
        int t = n;
        for (int i = 0; i <  n; i++) {
            n--;
            char temp = chars[i];
            chars[i] = chars[n];
            chars[n] = temp;
        }
        for (int i = t; i < length; i++) {
            char temp = chars[i];
            chars[i] = chars[length - 1];
            chars[length - 1] = temp;
            length--;
        }
        length = chars.length;
        for (int i = 0; i < length; i++) {
            char temp = chars[i];
            chars[i] = chars[length - 1];
            chars[length - 1] = temp;
            length--;
        }
        return String.valueOf(chars);
    }
复制代码

提交结果

网络异常,图片无法展示
|

2022/9/3

28. 实现 strStr()

题目描述

网络异常,图片无法展示
|

解题思路

本体是采用了暴力破解的方式,但是这道题是 KMP算法的经典题目

在我的文章从 KMP算法到 Java的 String.indexOf(String str)方法 中介绍了KMP算法及其解题思路

代码展示

public static int strStr(String haystack, String needle) {
    char[] chars = haystack.toCharArray();
    char[] chars1 = needle.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        int n = 0;
        int m = i;
        while(m < chars.length && n < chars1.length && chars[m] == chars1[n]){
            m++;
            n++;
        }
        if (n == chars1.length && chars[m - 1] == chars1[n - 1]){
            return i;
        }
    }
    return -1;
}
复制代码

提交结果

网络异常,图片无法展示
|

459. 重复的子字符串

题目描述

网络异常,图片无法展示
|

解题思路

  • 一样的,也是通过了KMP算法来做

代码展示

public boolean repeatedSubstringPattern(String s) {
        if (s.equals("")) return false;
        int len = s.length();
        // 原串加个空格(哨兵),使下标从1开始,这样j从0开始,也不用初始化了
        s = " " + s;
        char[] chars = s.toCharArray();
        int[] next = new int[len + 1];
        // 构造 next 数组过程,j从0开始(空格),i从2开始
        for (int i = 2, j = 0; i <= len; i++) {
            // 匹配不成功,j回到前一位置 next 数组所对应的值
            while (j > 0 && chars[i] != chars[j + 1]) j = next[j];
            // 匹配成功,j往后移
            if (chars[i] == chars[j + 1]) j++;
            // 更新 next 数组的值
            next[i] = j;
        }
        // 最后判断是否是重复的子字符串,这里 next[len] 即代表next数组末尾的值
        if (next[len] > 0 && len % (len - next[len]) == 0) {
            return true;
        }
        return false;
    }
复制代码

提交结果

网络异常,图片无法展示
|

2022/9/4

232. 用栈实现队列

题目描述

网络异常,图片无法展示
|

解题思路

具体可以看我的文章 你有用过 java中的栈和队列吗?怎么用栈来实现队列呢

提交结果

网络异常,图片无法展示
|

225. 用队列实现栈

题目描述

网络异常,图片无法展示
|

解题思路

  • 使用两个队列
  • in队列模拟栈
  • out队列保存临时数据
  • 新增的时候,将数值存到 outQueue中
  • 然后将 inQueue中的数据加入到 outQueue中
  • 又将 outQueue赋值给 inQueue

代码展示

public class MyStack {
    Queue<Integer> inQueue ;
    Queue<Integer> outQueue ;
    public MyStack() {
        inQueue = new LinkedList<>();
        outQueue = new LinkedList<>();
    }
    public void push(int x) {
        outQueue.offer(x);
        while(!inQueue.isEmpty()){
            outQueue.offer(inQueue.poll());
        }
        Queue<Integer> temp ;
        temp = inQueue;
        inQueue = outQueue;
        outQueue = temp;
    }
    public int pop() {
        return inQueue.poll();
    }
    public int top() {
        return inQueue.peek();
    }
    public boolean empty() {
        return inQueue.isEmpty();
    }
}
复制代码

提交结果

网络异常,图片无法展示
|

20. 有效的括号

题目描述

网络异常,图片无法展示
|

解题思路

  • 新建一个队列
  • 遍历字符串
  • 如果当前字符串为 左括号,则队列中存储右括号
  • 如果当前字符串为 右括号,则判断当前队列是否为空,且队列首元素是否相等
  • 弹出当前队列首元素
  • 最后判断队列中是否还有值
  • 有值则不匹配

这道题是完全借鉴了代码随想录,我自己写的方式和这个真的相差甚远,观感性太差了

代码展示

public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            //碰到左括号,就把相应的右括号入栈
            if (ch == '(') {
                deque.push(')');
            }else if (ch == '{') {
                deque.push('}');
            }else if (ch == '[') {
                deque.push(']');
            // 栈为空或者栈顶元素与当前 ch不匹配,则返回 false
            } else if (deque.isEmpty() || deque.peek() != ch) { 
                return false;
            }else {
                // 栈不为空,且栈顶元素与 ch一致
                deque.pop();
            }
        }
        //最后判断栈中元素是否匹配
        return deque.isEmpty();
    }
复制代码

提交结果

网络异常,图片无法展示
|

碎碎念

我都是先做的题目,最后统一总结的解题思路才发现,九月三号少做了一题,少了20积分,真的是出师不利

目录
相关文章
|
4月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
4月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
36 0
|
4月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
30 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
4月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
45 4
|
4月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
21 1
|
4月前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
4月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
4月前
|
Python
【Leetcode刷题Python】234.回文链表
两种判断链表是否为回文的方法:使用栈和拆分为两个链表后反转对比,并给出了相应的Python代码实现。
24 0