当前位置:   article > 正文

LeetCode算法,每日一题,冲击字节跳动_map pairs = new hashmap

map pairs = new hashmap() {{ put

目录

1、LeetCode 20.有效的括号

题目

小编菜解

思路及算法

大神解法

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

题目

小编菜解初版

小编菜解改进版 

思路及算法

大神解法

3、LeetCode 28.实现strStr

题目

小编菜解

大神解法

4、哪吒社区


1、LeetCode 20.有效的括号

题目

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

有效字符串需满足:

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

小编菜解

  1. public static boolean isValid(String s) {
  2. if (s.length()%2 != 0) return false;
  3. Map<Character,Character> hashMap = new HashMap<Character,Character>(){{
  4. put(')','(');
  5. put('}','{');
  6. put(']','[');
  7. }};
  8. //"{[]}"
  9. Queue<Character> queue = new LinkedList<Character>();
  10. for (int i = 0; i < s.length(); i++) {
  11. char c = s.charAt(i);
  12. if(hashMap.containsKey(c)){
  13. char t = queue.peek();
  14. System.out.println(t);//这个地方弹出的是{
  15. char tt = hashMap.get(c);//而这个对应的是],,上一处peek应该取得[
  16. System.out.println(tt);
  17. System.out.println(queue.peek() != hashMap.get(c));
  18. if (queue.isEmpty() || queue.peek() != hashMap.get(c)){
  19. return false;
  20. }
  21. queue.poll();
  22. }else{
  23. queue.offer(c);
  24. }
  25. }
  26. return queue.isEmpty();
  27. }

思路及算法

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

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

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

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

大神解法

  1. public static boolean isValid(String s){
  2. int n = s.length();
  3. if (n % 2 == 1) {
  4. return false;
  5. }
  6. Map<Character, Character> pairs = new HashMap<Character, Character>() {{
  7. put(')', '(');
  8. put(']', '[');
  9. put('}', '{');
  10. }};
  11. Deque<Character> stack = new LinkedList<Character>();
  12. for (int i = 0; i < n; i++) {
  13. char ch = s.charAt(i);
  14. if (pairs.containsKey(ch)) {
  15. if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
  16. return false;
  17. }
  18. stack.pop();
  19. } else {
  20. stack.push(ch);
  21. }
  22. }
  23. return stack.isEmpty();
  24. }

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

Java中Queue和Deque的区别

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

题目

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

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

说明:

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

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

小编菜解初版

  1. public static Integer[] removeDuplicates(Integer[] nums) {
  2. if(nums == null || nums.length == 0){
  3. return nums;
  4. }
  5. List<Integer> tempList = Arrays.asList(nums);
  6. for (int i = tempList.size() - 1; i >= 0; i--) {
  7. Integer current = tempList.get(i);
  8. if(i-1>0){
  9. Integer next = tempList.get(i - 1);
  10. if(next == current){
  11. tempList.remove(current);
  12. }
  13. }
  14. }
  15. Integer[] ret = new Integer[tempList.size()];
  16. tempList.toArray(ret);
  17. return ret;
  18. }

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

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

小编菜解改进版 

  1. public static Integer[] removeDuplicates(Integer[] nums) {
  2. if(nums == null || nums.length == 0){
  3. return nums;
  4. }
  5. List<Integer> tempList = Arrays.asList(nums);
  6. List<Integer> list = new ArrayList<>(tempList);
  7. for (int i = list.size() - 1; i >= 0; i--) {
  8. Integer current = list.get(i);
  9. if(i-1>0){
  10. Integer next = list.get(i - 1);
  11. if(next == current){
  12. list.remove(current);
  13. }
  14. }
  15. }
  16. Integer[] ret = new Integer[list.size()];
  17. list.toArray(ret);
  18. return ret;
  19. }

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

思路及算法

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

大神解法

  1. public static int removeDuplicates2(Integer[] nums) {
  2. int n = nums.length;
  3. if (n == 0) {
  4. return 0;
  5. }
  6. int fast = 1, slow = 1;
  7. while (fast < n) {
  8. if (nums[fast] != nums[fast - 1]) {
  9. nums[slow] = nums[fast];
  10. ++slow;
  11. }
  12. ++fast;
  13. }
  14. return slow;
  15. }

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

3、LeetCode 28.实现strStr

题目

实现 strStr() 函数。

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

说明:

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

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

小编菜解

  1. public static int strStr(String haystack, String needle) {
  2. if(haystack == null || !haystack.contains(needle)){
  3. return -1;
  4. }
  5. if(needle == ""){
  6. return 0;
  7. }
  8. int strLg = haystack.length();
  9. int findLg = needle.length();
  10. for (int i = 0; i < strLg; i++) {
  11. char c = haystack.charAt(i);
  12. if (c == needle.charAt(0) && i+findLg <= strLg){
  13. String temp = haystack.substring(i,i + findLg);
  14. if (temp.equals(needle)){
  15. return i;
  16. }
  17. }
  18. }
  19. return -1;
  20. }

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

大神解法

  1. public static int strStr(String haystack, String needle) {
  2. int strLg = haystack.length();
  3. int findLg = needle.length();
  4. for (int i = 0; i+findLg <= strLg; i++) {
  5. boolean flag = true;
  6. for (int j = 0; j < findLg; j++) {
  7. if (haystack.charAt(i+j)!=needle.charAt(j)){
  8. flag = false;
  9. break;
  10. }
  11. }
  12. if (true == flag){
  13. return i;
  14. }
  15. }
  16. return -1;
  17. }

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

4、哪吒社区

哪吒社区入口

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/315519
推荐阅读
相关标签
  

闽ICP备14008679号