力扣刷题(复习版1)

news2024/12/23 13:22:28

文章目录

    • 题目:最大重复子字符串
      • 题解
    • 题目: 面试题 16.07. 最大数值
      • 题解
    • 题目: 最大字符串配对数目
      • 题解
    • 题目: 字符串中第二大的数字
      • 题解
    • 题目: 统计最大组的数目
      • 题解
    • 题目: 删除每行中的最大值
      • 题解
    • 题目: 二叉树的所有路径
      • 题解
    • 题目: 七进制数
      • 题解
    • 题目: N 叉树的最大深度
      • 题解
    • 题目: 反转字符串中的单词 III
      • 题解
    • 题目: 员工奖金 -- sql
      • 题解
    • 题目: N 叉树的前序遍历
      • 题解
    • 题目: N 叉树的后序遍历
      • 题解
    • 题目: N 叉树的层序遍历
      • 题解
    • 题目: 最长和谐子序列
      • 题解
    • 题目: 种花问题
      • 题解
    • 题目: 三个数的最大乘积
      • 题解
    • 题目: 二叉树中第二小的节点
      • 题解
    • 总结

题目:最大重复子字符串

原题链接:最大重复子字符串
在这里插入图片描述

题解

方法:暴力延长word的重复次数并比较,用contains()函数

 public static int maxRepeating(String sequence, String word) {
     int maxRepeat = 0;
     StringBuilder repeatedWord = new StringBuilder(word);

     // 循环尝试增加word的重复次数,直到不再是子字符串
     while (sequence.contains(repeatedWord)) {
         maxRepeat++;
         repeatedWord.append(word);
     }

     return maxRepeat;
 }

题目: 面试题 16.07. 最大数值

原题链接: 面试题 16.07. 最大数值

题解

方法:通过计算两个整数差值的符号位

表达式 a * (1 - sign) + b * sign 能够实现两个值的二选一效果

 public int maximum(int a, int b) {
     long diff = (long)a - (long)b;
     long sign = (diff >>> 63) & 1;
     return (int)(a * (1 - sign) + b * sign);
 }

题目: 最大字符串配对数目

原题链接: 最大字符串配对数目
在这里插入图片描述

在这里插入图片描述

题解

public static int maximumNumberOfStringPairs(String[] words) {
      HashSet<String> set = new HashSet<>();
      int count = 0;
      for (String word : words) {
          String reversed = "" + word.charAt(1) + word.charAt(0);
          // 检查反转字符串是否已经存在于 set 中
          if (set.contains(reversed)) {
              count++;
          }
          set.add(word);
      }
      return count;
  }

题目: 字符串中第二大的数字

原题链接: 字符串中第二大的数字
在这里插入图片描述

题解

方法1:

 public static int secondHighest(String s) {
     Set<Integer> set = new HashSet<>();
     for (char c : s.toCharArray()) {
         if (Character.isDigit(c)) {
             set.add(c - '0');
         }
     }
     int firstMax = -1;
     int secondMax = -1;
     for (Integer i : set) {
         if (i > firstMax) {
             secondMax = firstMax;
             firstMax = i;
         } else if (i > secondMax && i < firstMax) {
             secondMax = i;
         }
     }
     return secondMax;
 }

方法2:
先找到最大值删除,如果set不为空,继续寻找最大值(答案)

 public static int secondHighest11(String s) {
     Set<Integer> set = new HashSet<>();
     for (char c : s.toCharArray()) {
         if (Character.isDigit(c)) {
             set.add(c - '0');
         }
     }
     int maxValue = -1;
     for (Integer i : set) {
         if (i > maxValue) {
             maxValue = i;
         }
     }
     set.remove(maxValue);
     if (set.size() == 0) return -1;
     maxValue = -1;
     for (Integer i : set) {
         if (i > maxValue) {
             maxValue = i;
         }
     }
     return maxValue;
 }

题目: 统计最大组的数目

原题链接: 统计最大组的数目
在这里插入图片描述

题解

方法:利用 map 将相同的数位和作为键(哈希表)

public static int sumDigit(int i) {
    int res = 0;
    while (i > 0) {
        res += i % 10;
        i /= 10;
    }
    return res;
}

public static int countLargestGroup(int n) {
    int maxCnt = 0;
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 1; i <= n; i++) {
        int sum = sumDigit(i);
        int count = map.getOrDefault(sum, 0) + 1;
        map.put(sum, count);
        maxCnt = Math.max(maxCnt, count);
    }
    
    int res = 0;
    for (Integer value : map.values()) {
        if (value == maxCnt) {
            res++;
        }
    }
    return res;
}

题目: 删除每行中的最大值

原题链接: 删除每行中的最大值
在这里插入图片描述

题解

方法:通过逐列查找每一行未使用的最大值,并将其标记为已使用,然后将每列的最大值累加得到最终结果。主要利用 used 数组来跟踪已经处理过的元素

public boolean[][] used = new boolean[51][51];

 // 找到一行中最最大的元素  并标记已处理
 public int findMaxByRow(int[][] grid, int row) {
     int maxValue = -1;
     int maxIndex = -1;
     for (int i = 0; i < grid[0].length; i++) {
         if (!used[row][i] && grid[row][i] > maxValue) {
             maxValue = grid[row][i];
             maxIndex = i;
         }
     }
     if (maxIndex != -1) {
         used[row][maxIndex] = true;
     }
     return maxValue;
 }

 public int deleteGreatestValue(int[][] grid) {
     int res = 0;
     for (int j = 0; j < grid[0].length; j++) { 
         int maxValue = -1;
         for (int i = 0; i < grid.length; i++) { 
             int maxByRow = findMaxByRow(grid, i);
             if (maxValue < maxByRow)
                 maxValue = maxByRow;
         }
         res += maxValue;
     }
     return res;
 }

题目: 二叉树的所有路径

原题链接: 二叉树的所有路径
在这里插入图片描述

题解

方法:创建两个队列,一个用于存储当前节点 (nodeQueue),另一个用于存储从根节点到当前节点的路径 (pathQueue)。将根节点和路径 “root.val” 入队。

先去看一下二叉树层次遍历,然后看这个题,就很简单了

 public List<String> binaryTreePaths(TreeNode root) {
     List<String> paths = new ArrayList<String>();
     if (root == null) {
         return paths;
     }
     Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
     Queue<String> pathQueue = new LinkedList<String>();

     nodeQueue.offer(root);
     pathQueue.offer(Integer.toString(root.val));

     while (!nodeQueue.isEmpty()) {
         TreeNode node = nodeQueue.poll();
         String path = pathQueue.poll();

         if (node.left == null && node.right == null) {
             paths.add(path);
         } else {
             if (node.left != null) {
                 nodeQueue.offer(node.left);
                 pathQueue.offer(new StringBuffer(path).append("->").append(node.left.val).toString());
             }

             if (node.right != null) {
                 nodeQueue.offer(node.right);
                 pathQueue.offer(new StringBuffer(path).append("->").append(node.right.val).toString());
             }
         }
     }
     return paths;
 }

题目: 七进制数

原题链接: 七进制数
在这里插入图片描述

题解

方法:除7取于法,余数倒着写

 public static String convertToBase7(int num) {
     if (num == 0) return "0";
     StringBuilder res = new StringBuilder();
     int flag = num < 0 ? -1 : 1;
     num = Math.abs(num);
     while (num > 0) {
         res.append(num % 7);
         num /= 7;
     }
     return flag == 1 ? res.reverse().toString() : "-" + res.reverse().toString();
 }

题目: N 叉树的最大深度

原题链接: N 叉树的最大深度
在这里插入图片描述

题解

方法1:广度优先搜索
在每次进入 while 循环时,首先获取 queue 中的节点数量,这代表当前层的节点数。接着,逐一处理这些节点,将它们的子节点添加到 queue 中

public int maxDepth(Node root) {
    if (root == null) return 0;
    int res = 0;
    LinkedList<Node> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        res += 1;
        int size = queue.size();
        while (size > 0) {
            Node node = queue.poll();
            queue.addAll(node.children);
            size--;
        }
    }
    return res;
}

方法2: 深度优先搜索

 public int maxDepth(Node root) {
     if (root == null) return 0;
     int maxDepth = 0;
     List<Node> children = root.children;
     for (Node child : children) {
         int childDepth = maxDepth(child);
         maxDepth = Math.max(maxDepth, childDepth);
     }

     return maxDepth+1;
 }

题目: 反转字符串中的单词 III

原题链接: 反转字符串中的单词 III

在这里插入图片描述

题解

方法:主要通过 StringBuilder 的 reverse() 方法来反转每个单词

public String reverseWords(String s) {
    String[] words = s.split(" ");
    StringBuilder res = new StringBuilder();
    for (String word : words) {
        res.append(new StringBuilder(word).reverse()).append(" ");
    }
    return res.toString().trim();
}

题目: 员工奖金 – sql

原题链接: 员工奖金
在这里插入图片描述
在这里插入图片描述

题解

方法:因为奖金为空的也要用null表示。因为加一个:or b.bonus is null

select e.name,b.bonus  
from Employee as e  left join Bonus as b on e.empId=b.empId
where b.bonus  < 1000  or b.bonus is null;

题目: N 叉树的前序遍历

原题链接: N 叉树的前序遍历
在这里插入图片描述

题解

方法:N 叉树的前序遍历与二叉树的前序遍历的思路和方法基本一致

前序遍历:根左右

public List<Integer> preorder(Node root) {
      List<Integer> res = new ArrayList<>();
      helper(root, res);
      return res;
  }

  public void helper(Node root, List<Integer> res) {
      if (root == null) return;
      res.add(root.val); // 访问根元素
      for (Node child : root.children) {
          helper(child, res); 
      }
  }

二叉树前序遍历:

 List<Integer> res = new ArrayList<>();
 // 前序遍历
 public List<Integer> preorderTraversal(TreeNode root) {
     if (root == null) return res;
     res.add(root.val);
     preorderTraversal(root.left);
     preorderTraversal(root.right);
     return res;
 }

题目: N 叉树的后序遍历

原题链接: N 叉树的后序遍历
在这里插入图片描述

题解

 public List<Integer> postorder(Node root) {
     List<Integer> res = new ArrayList<>();
     helper(root, res);
     return res;
 }

 private void helper(Node root, List<Integer> res) {
     if (root == null) return;
     for (Node child : root.children) {
         helper(child, res);
     }
     res.add(root.val);
 }

题目: N 叉树的层序遍历

原题链接: N 叉树的层序遍历
在这里插入图片描述

题解

方法:和二叉树层次遍历相同,借助队列queue

 public List<List<Integer>> levelOrder(Node root) {
     List<List<Integer>> res = new ArrayList<>();
     if (root == null) return res;
     LinkedList<Node> queue = new LinkedList<>();
     queue.offer(root);
     while (!queue.isEmpty()) {
         int size = queue.size();
         ArrayList<Integer> list = new ArrayList<>();
         while (size > 0) {
             Node node = queue.poll();
             list.add(node.val);
             for (Node child : node.children) {
                 queue.offer(child);
             }
             size--;
         }
         res.add(list);
     }
     return res;
 }

题目: 最长和谐子序列

原题链接: 最长和谐子序列
在这里插入图片描述

题解

方法:这个方法利用 HashMap 记录每个数字的出现次数,并通过检查每个数字和它的下一个数字是否同时存在来寻找和谐子数组的最大长度。

public static int findLHS(int[] nums) {
      int res = 0;
      HashMap<Integer, Integer> map = new HashMap<>();
      for (int num : nums) {
          map.put(num, (1 + map.getOrDefault(num, 0)));
      }

      for (Integer i : map.keySet()) {
          if (map.containsKey(i + 1)) {
              res = Math.max(res, map.get(i) + map.get(i + 1));
          }
      }
      return res;
  }

题目: 种花问题

原题链接: 种花问题
在这里插入图片描述

题解

方法:通过遍历花坛,检查每个位置是否可以放置花朵,确保前后位置均为空。它在合适的位置放置花朵,并计算可以放置的总花朵数,最终判断是否能满足所需的花朵数量。

 public boolean canPlaceFlowers(int[] flowerbed, int n) {
     int count = 0;
     for (int i = 0; i < flowerbed.length; i++) {
         // 如果当前位置是 0 且前后位置也为空(边界条件也要考虑)
         if (flowerbed[i] == 0 &&
                 (i == 0 || flowerbed[i - 1] == 0) &&
                 (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {

             // 放置花朵
             flowerbed[i] = 1;
             count++;
         }
     }
     return count >= n;
 }

题目: 三个数的最大乘积

原题链接: 三个数的最大乘积
在这里插入图片描述

题解

方法:排序

我第一想法没考虑到排序,感觉刷迷糊了😭

 public int maximumProduct(int[] nums) {
     Arrays.sort(nums);
     return Math.max(nums[0] * nums[1] * nums[nums.length - 1], nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3]);
 }

题目: 二叉树中第二小的节点

原题链接: 二叉树中第二小的节点
在这里插入图片描述

题解

方法1:

public static int findSecondMinimumValue(TreeNode root) {
    HashSet<Integer> set = new HashSet<>();
    helper(root, set);
    if (set.size() < 2) return -1;
    int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
    for (int i : set) {
        if (i < min1) {
            min1 = i;
        }
    }
    set.remove(min1);
    for (int i : set) {
        if (i < min2) {
            min2 = i;
        }
    }
    return min2;
}

public static void helper(TreeNode root, HashSet<Integer> set) {
    if (root == null) return;
    set.add(root.val);
    helper(root.left, set);
    helper(root.right, set);
}

方法:

 public static int findSecondMinimumValue(TreeNode root) {
     if (root == null) return -1;
     // 初始最小值为根节点的值
     int firstMin = root.val;
     // 使用递归找出第二小的值
     return findSecondMinimum(root, firstMin);
 }

 private static int findSecondMinimum(TreeNode root, int firstMin) {
     if (root == null) return -1;
     // 如果当前节点值大于最小值,可能是第二小的值
     if (root.val > firstMin) return root.val;

     // 递归查找左右子树中的第二小值
     int left = findSecondMinimum(root.left, firstMin);
     int right = findSecondMinimum(root.right, firstMin);

     // 处理左右子树的值
     if (left != -1 && right != -1) {
         return Math.min(left, right);
     }
     return Math.max(left, right);
 }

总结

  1. 拿到一个题目要认真读题(建议读2遍),没思路可以看一下提示,有时候提示会给你一些解题思路的
  2. 不要被给的输入输出示例迷惑了,有时候会干扰你解题的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录|Chart控件使用

目录 前言一、Series集合1.1 什么是Series1.2 IsValueShownAsLabel1.3 Points 二、ChartArea2.1 轴- Axes2.1.1 Title2.1.2 刻度下的Maximum、Minimum2.1.3 间隔- Interval2.1.4 网格刻度线 2.2 游标- CursorX/CursorYMajorGrid属性中的Enabled 更新时间 前言 参考视频&#xf…

七、库存管理——盘点业务

第一节 库存管理盘点 1、盘点的目的 答&#xff1a;是指通过定期或临时对库存商品的实际数量进行盘查、清点&#xff0c;然后掌握货物的流动情况&#xff08;入库、出库、调拨、在库等&#xff09;&#xff0c;最后对仓库现有物品的实际数量与保管账上记录的数量相核对&…

Spring Boot集成Stripe快速入门demo

1.什么是Stripe&#xff1f; 一体化全球支付平台&#xff0c;开启收入增长引擎&#xff0c;针对不同规模业务打造的支付解决方案&#xff0c;满足从初创公司到跨国企业的多维度需求&#xff0c;助力全球范围内线上线下付款。 转化更多客户: 通过内置的优化功能、100 多种支付…

QT QGraphicsView实现预览图片显示缩略图功能

QT QGraphicsView实现预览图片显示缩略图功能QT creator Qt5.15.2 头文件&#xff1a; #ifndef TGRAPHICSVIEW_H #define TGRAPHICSVIEW_H#include <QGraphicsView> #include <QMainWindow> #include <QObject> #include <QWidget>class TGraphicsVie…

vue页面自适应 动态 postcss postcss-pxtorem

vue页面自适应 动态 postcss postcss-pxtorem postcss-pxtorem实现页面自适应1、安装postcss-pxtorem2、根目录创建postcss.config.js&#xff0c;并配置以下内容3、创建rem.js&#xff0c;动态设置root px4、在main.js中引入rem.js5、在main.js中创建全局处理函数px2rem6、对…

【王树森】Vision Transformer (ViT) 用于图片分类(个人向笔记)

图片分类任务 给定一张图片&#xff0c;现在要求神经网络能够输出它对这个图片的分类结果。下图表示神经网络有40%的信心认定这个图片是狗 ResNet&#xff08;CNN&#xff09;曾经是是图像分类的最好模型在有足够大数据做预训练的情况下&#xff0c;ViT要强于ResNetViT 就是Tr…

S7-200编程软件STEP 7打开时界面乱码显示Translation Required

遇到的问题 如题&#xff0c;两个月没有打开过S7-200编程软件&#xff08;软件版本是V4.0 STEP 7 MicroWIN SP9&#xff0c;电脑系统是Windows 11&#xff09;&#xff0c;这一次打开就发现它的那个界面乱码了&#xff0c;原来时中文汉化的地方全都变成了Translation Required…

笔记整理—内核!启动!—uboot部分(1)

常规启动时&#xff0c;各镜像都在SD卡中的各种分区中&#xff0c;内核放在kernel分区&#xff0c;从SD卡到DDR的连接处&#xff08;内核不需要进行重定位&#xff0c;直接从链接处启动&#xff09;。uboot从sd卡分区读使用movi命令。 使用fastboot指令可以查看分区情况&#x…

通过Dot1q终结子接口实现VLAN间互访

如图1所示&#xff0c;SwitchA为支持配置子接口的三层交换机&#xff0c;SwitchB为二层交换机&#xff0c;SwitchA通过一个三层以太网接口与SwitchB互连。用户主机被划分到两个VLAN&#xff1a;VLAN2和VLAN3。由于业务需要&#xff0c;不同VLAN的用户要求互通。 图1 通过Dot1q…

AI革命:清华大学揭秘大模型工具学习的未来

&#x1f31f; 未来已来&#xff1a;大模型工具学习开启智能新时代 &#x1f31f; 清华大学THUNLP最新研究&#xff0c;探索AI工具使用的无限可能 文末有报告免费下载&#xff0c;需要的朋友自行下跳。 亲爱的读者朋友们&#xff0c;人工智能的浪潮已经不可阻挡地涌入我们的…

LabVIEW VI并行执行设置

要在多个程序中运行同一个VI&#xff08;Virtual Instrument&#xff09;&#xff0c;通常需要确保VI的重入性&#xff08;Reentrancy&#xff09;设置正确。在LabVIEW中&#xff0c;可以使用“重入性”&#xff08;Reentrancy&#xff09;选项来允许同一个VI同时在多个地方调用…

RAG噪声的设计及其对大模型问答的作用分析

有趣的大模型中RAG噪声的作用分析 大模型&#xff08;LLMs&#xff09;在多个任务上表现出色&#xff0c;但存在依赖过时知识、幻觉等问题。RAG作为一种提高LLM性能的方法&#xff0c;通过在推理过程中引入外部信息来缓解这些限制。 Figure 1 展示了一个来自 NoiserBench 的示…

Docker技术

一、Docker简介 1.什么是docker Docker是管理容器的引擎&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚拟化技术。 它具有以下几个重要特点和优势&#xff1a; 1. 轻量级虚拟化 &#xff1a;Docker 容器相较于传统的虚拟机更加轻量和高效&#xff0c;能够快速启…

【高中数学/极值/判别式法】已知实数a和b,b在(0,1)区间,a-b=1,则1/(a-1)+1/(5-4b)的最小值是?

【问题】 已知实数a,b&#xff0c;b在(0,1)区间&#xff0c;a-b1,则1/(a-1)1/(5-4b)的最小值是&#xff1f; 【来源】 《解题卡壳怎么办 高中数学解题智慧点剖析》P34 余继光 苏德矿合著 浙江大学出版社出版 【破题点】 将a-1用b取代&#xff0c;发现结果是二次式相除&…

24-8-31-读书笔记(十六)-《契诃夫文集》(十一)([俄] 契诃夫 [译] 汝龙 )

文章目录 《契诃夫文集》&#xff08;十一&#xff09;&#xff08;[俄] 契诃夫 [译] 汝龙 &#xff09;目录阅读笔记记录总结 《契诃夫文集》&#xff08;十一&#xff09;&#xff08;[俄] 契诃夫 [译] 汝龙 &#xff09; 8月最后一天了&#xff0c;心里很多的感慨&#xff0…

Bluetooth: gatt server example 解读

在 core spec 中有 Example ATT Server contents,这里对此进行解读; Assigned_Numbers.pdf 需要提前准备,可以从 SIG 下载; Step-1 从这个服务看,server handle 是1, 但是第一个 characteristic clare handle是 4,所以不能预设handle 是按顺序连续的; Step-2 Servic…

强推第一本给程序员看的AI Agent教程终于来啦!全方位解析LLM-Agent

AI Agent火爆到什么程度&#xff1f; &#x1f340;OpenAI创始人奥特曼预测&#xff1a;未来各行各业&#xff0c;每一个人都可以拥有一个AI Agent。 &#x1f340;比尔盖茨在2023年曾预言&#xff1a;AI Agent将彻底改变人机交互方式&#xff0c;并颠覆整个软件行业。 &#x…

MATLAB生成COE文件

MATLAB代码 % 参数设置 N 4096; % 数据点数量 t linspace(0, 2*pi, N); % 时间向量 width 12; % 位宽% 正弦波&#xff0c;幅度在0到5之间 sine_wave 2.5 * sin(t) 2.5;% 三角波&#xff0c;幅度在0到5之间 tri_wave 5 * (1 - abs(mod(t/(2*pi)*4, 2) - 1));% 方波&…

记一次学习--webshell绕过

目录 第一题 第二题 第三题 第四题 第五题 第一题 <?php$action $_GET[action]; $parameters $_GET; if (isset($parameters[action])) {unset($parameters[action]); }$a call_user_func($action, ...$parameters); 上面题目&#xff0c;下面的call_user_func有一…

Spring 是什么

首先我们先看一个例子。以下是代码的结构。 public interface UserDAO {/*** 根据id删除用户*/void deleteById(); } public class UserDAOImplForMySQL implements UserDAO {Overridepublic void deleteById() {System.out.println("使用MySQL数据库删除信息....")…