LeetCode算法,每日一题,冲击字节跳动

2023-11-10

目录

1、LeetCode 20.有效的括号

题目

小编菜解

思路及算法

大神解法

2、LeetCode 26.删除有序数组中的重复项

题目

小编菜解初版

小编菜解改进版 

思路及算法

大神解法

3、LeetCode 28.实现strStr

题目

小编菜解

大神解法

4、哪吒社区


1、LeetCode 20.有效的括号

题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

小编菜解

public static boolean isValid(String s) {
    if (s.length()%2 != 0) return false;
    Map<Character,Character> hashMap = new HashMap<Character,Character>(){{
        put(')','(');
        put('}','{');
        put(']','[');
    }};
    //"{[]}"
    Queue<Character> queue = new LinkedList<Character>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if(hashMap.containsKey(c)){
            char t = queue.peek();
            System.out.println(t);//这个地方弹出的是{
            char tt = hashMap.get(c);//而这个对应的是],,上一处peek应该取得[
            System.out.println(tt);
            System.out.println(queue.peek() != hashMap.get(c));
            if (queue.isEmpty() || queue.peek() != hashMap.get(c)){
                return false;
            }
            queue.poll();
        }else{
            queue.offer(c);
        }
    }
    return queue.isEmpty();
}

思路及算法

判断括号的有效性可以使用「栈」这一数据结构来解决。

当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss 无效,返回 \text{False}False。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。

在遍历结束后,如果栈中没有左括号,说明我们将字符串 ss 中的所有左括号闭合,返回True,否则返回False。

注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回False,省去后续的遍历判断过程。

大神解法

public static boolean isValid(String s){
    int n = s.length();
    if (n % 2 == 1) {
        return false;
    }

    Map<Character, Character> pairs = new HashMap<Character, Character>() {{
        put(')', '(');
        put(']', '[');
        put('}', '{');
    }};
    Deque<Character> stack = new LinkedList<Character>();
    for (int i = 0; i < n; i++) {
        char ch = s.charAt(i);
        if (pairs.containsKey(ch)) {
            if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                return false;
            }
            stack.pop();
        } else {
            stack.push(ch);
        }
    }
    return stack.isEmpty();
}

思路和我的思路完全一致,就是我使用的是单向队列,结果就是失败,加油吧!

Java中Queue和Deque的区别

2、LeetCode 26.删除有序数组中的重复项

题目

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

小编菜解初版

public static Integer[] removeDuplicates(Integer[] nums) {
    if(nums == null || nums.length == 0){
        return nums;
    }
    List<Integer> tempList = Arrays.asList(nums);
    for (int i = tempList.size() - 1; i >= 0; i--) {
        Integer current = tempList.get(i);
        if(i-1>0){
            Integer next = tempList.get(i - 1);
            if(next == current){
                tempList.remove(current);
            }
        }
    }
    Integer[] ret = new Integer[tempList.size()];
    tempList.toArray(ret);
    return ret;
}

为什么为这样呢?我记得list是可以remove的啊,百思不得其解,查一下源码,猛然发现 

Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重写这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。

小编菜解改进版 

public static Integer[] removeDuplicates(Integer[] nums) {
    if(nums == null || nums.length == 0){
        return nums;
    }
    List<Integer> tempList = Arrays.asList(nums);
    List<Integer> list = new ArrayList<>(tempList);
    for (int i = list.size() - 1; i >= 0; i--) {
        Integer current = list.get(i);
        if(i-1>0){
            Integer next = list.get(i - 1);
            if(next == current){
                list.remove(current);
            }
        }
    }
    Integer[] ret = new Integer[list.size()];
    list.toArray(ret);
    return ret;
}

不报错了,结果也对,perfect!

思路及算法

相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。

大神解法

public static int removeDuplicates2(Integer[] nums) {
    int n = nums.length;
    if (n == 0) {
        return 0;
    }
    int fast = 1, slow = 1;
    while (fast < n) {
        if (nums[fast] != nums[fast - 1]) {
            nums[slow] = nums[fast];
            ++slow;
        }
        ++fast;
    }
    return slow;
}

我去,无情。我的解法果然很菜,题意都没读懂,人家要的是长度,你返回一个数组,作甚??

3、LeetCode 28.实现strStr

题目

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

小编菜解

public static int strStr(String haystack, String needle) {
    if(haystack == null || !haystack.contains(needle)){
        return -1;
    }
    if(needle == ""){
        return 0;
    }

    int strLg = haystack.length();
    int findLg = needle.length();
    for (int i = 0; i < strLg; i++) {
        char c = haystack.charAt(i);
        if (c == needle.charAt(0) && i+findLg <= strLg){
            String temp = haystack.substring(i,i + findLg);
            if (temp.equals(needle)){
                return i;
            }
        }
    }
    return -1;
}

没看出有什么问题,可是提交总是提示解答错误,也是无奈。

大神解法

public static int strStr(String haystack, String needle) {
    int strLg = haystack.length();
    int findLg = needle.length();
    for (int i = 0; i+findLg <= strLg; i++) {
        boolean flag = true;
        for (int j = 0; j < findLg; j++) {
            if (haystack.charAt(i+j)!=needle.charAt(j)){
                flag = false;
                break;
            }
        }
        if (true == flag){
            return i;
        }
    }
    return -1;
}

感觉大神的解法还没我的解法简单呢?可我的为何一直提交都是出错,哎,无奈。

4、哪吒社区

哪吒社区入口

1、数据结构和算法基础
2、人工智能数据基础与Python机器学习实战
3、机器学习数学基础
4、node.js入门指南

关注公众号,备注1024,赠送Java学习路线思维导图、大厂面试真题    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode算法,每日一题,冲击字节跳动 的相关文章

随机推荐

  • 小程序 video 组件播放本地视频(黑屏无法播放,报错:MEDIA_ERR_SRC_NOT_SUPPORTED)

    小程序播放本地视频 黑屏无法播放 报错 MEDIA ERR SRC NOT SUPPORTED
  • VS9(vs2008) 下 Debug 显示 UTF8 字符串

    默认的 VC调试器只能正常显示ANSI字符串及UNICODE字符串 而UTF 8字符串及其他格式则无法显示 这里无需编写插件及修改配置文件 只需要将要显示的字符串拉到Watch中 并在变量后面添加 s8即可显示 gt 同样类型的功能也应该很
  • Anaconda-tensorflow-keras安装方法学习

    目录 开发工具 Anaconda 下载 安装与配置 Anaconda 下载 Anaconda 安装 Anaconda 安装问题 Anaconda 添加清华镜像源 安装tensorflow 接着安装keras 使用Jupyter notebo
  • FI 总账科目(GL),应付款方(供应商),应收款方(客户)的主要数据库表流向及说明

    学习FI模块也有几天了 今天的视频冲击 现在基本有点模型了 现将整理好的成果依次发布出 首先说下该模块中主要数据流向 BSIK 是供应商的未清项表 BSAK 是供应商的已清项表 BSID 是客户的未清项表 BSAD 是客户的已清项表 BSI
  • CentOS利用expect批量推送ssh public key的脚本

    方法1 bin bash Author Razor QQ 254456122 Date 2021 10 29 FileName sshkey sh URL https blog csdn net mandarin meng spm 1019
  • 使用预训练模型运行DiffusionDetection

    工程链接 https github com ShoufaChen DiffusionDet DIffusionDet需要的基础环境及各种包都配置好了 接下来我们开始用Pre trained Model来运行demo py 1 打包下载工程
  • Shell脚本之read用法

    read 默认接受键盘的输入 回车符代表输入结束 read命令选项 p 打印信息 t 限定时间 s 不回显 n 输入字符个数 bin bash clear echo n e Login read acc read p Login acc e
  • python函数练习题讲解

    自学的知识 用来记录一下 练习 1 写一个打印一条横线的函数 提示 横线是若干个 组成 2 写一个函数 可以通过输入的参数 打印出自定义行数的横线 提示 调用上面的函数 3 写一个函数求三个数的和 4 写一个函数求三个数的平均值 提示 调用
  • va_start和va_end详解

    1 在C中 当无法列出传递函数的所有实参的类型和数目时 可以用省略号指定参数表 例如 void foo void foo parm list 2 函数参数的传递原理 函数参数是以栈的形式存取 从右至左入栈 参数的内存存放格式 参数存放在内存
  • 如何查看海思SDK的版本

    命令 cat proc umap vpss 效果如下 第一行的version就是版本信息
  • html学习——表格标签

    表格 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 table border 1px tr td 1 1 td td 1 2 td td 1 3 td tr tr td 2 1 td td 2 2 td td 2
  • css3直线运动_CSS3实现动画线条运动效果实例集合(一)

    在我们日常的开发中 有时候有的图片 布局块需要加一下边框运动效果 对于这些效果 我们可以使用CSS3动画属性animation 再配合css的一些技巧制作出来 下面是收藏的一些效果实例 1 边框流动效果 html css3效果的内容部分 c
  • 手写一个react-redux,原理一目了然

    react redux的功能如下 Provider 为后代组件提供store connect 为组件提供数据和变更方法 数据变化时自动更新组件 了解react redux的功能移步这里 下面我们开始实现react redux的几个功能 my
  • curl命令忽略不受信任的https安全限制

    用curl命令没有得到返回 还报了个提示 curl 60 Issuer certificate is invalid More details here http curl haxx se docs sslcerts html curl p
  • idea学习系列五之debug及插件的使用

    idea学习系列五之debug及插件的使用 上一篇 介绍了maven及服务器的使用 这里将介绍idea中debug及插件的使用 在实际开发中debug是最常用的了 而且idea相比于eclipse中的debug还新增了一些比较好用的功能 还
  • 微信小程序教你实现双层嵌套菜单栏

    最近在做的项目有这样一个需求 也不太好描述 就是有两个顶部菜单栏 每个二级菜单栏的item都有自己页面 每个页面都可以通过左右滑动来切换 第一个想到的实现方法就是双层swiper嵌套 但想要达到一个联动的效果还是有一点点复杂 去网上找了一圈
  • IT-项目管理(大作业个人报告)

    文章目录 担任角色 开发方法 前端工作 CI CD流水线 担任角色 前端开发 CI CD流程实现 开发方法 基于现有框架Vue或React中的一种 使用iview或antd库 构建前端Web交互界面 对于已收集的需求 小组会议 论坛交流 看
  • 基于IO、NIO、Netty的Java网络程序

    基于IO NIO Netty的Java网络程序 一 IO 1 项目创建 2 代码 3 运行 二 NIO 1 项目创建 2 代码 3 运行 三 Netty 1 项目环境配置 2 代码 3 运行结果 总结 参考文章 一 IO 1 项目创建 在I
  • Junit单元测试,BIO、NIO、AIO概念、Buffer类,Channel通道

    单元测试 Junit介绍 Junit是一个Java语言的单元测试框架 简单理解为可以用取代Java的 部分 main方法 Junit属于第三方工具 需导入jar包后使用 Junit基本使用 Junit的作用 可以单独的运行某一个方法 Jun
  • LeetCode算法,每日一题,冲击字节跳动

    目录 1 LeetCode 20 有效的括号 题目 小编菜解 思路及算法 大神解法 2 LeetCode 26 删除有序数组中的重复项 题目 小编菜解初版 小编菜解改进版 思路及算法 大神解法 3 LeetCode 28 实现strStr