• LeetCode 619, 58, 24


    619. 只出现一次的最大数字

    题目链接

    619. 只出现一次的最大数字

    • MyNumbers的字段为num

    要求

    • 找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null

    知识点

    1. max():取最大值函数。如果一个值都没有,则返回null
    2. count():统计个数的函数。
    3. group by:按照某些字段进行分组。
    4. having:分组后限制的条件,类似于 where ,但必须放在 group by 之后。

    思路

    要找到单一数字,就得对每个数字的个数进行统计,然后找到出现个数为1的数字们,取它们的最大值作为结果,如果没有一个出现次数为1的数字,则可以利用 max() 的特性返回 null

    代码

    使用where限制:

    select
        max(num) num
    from
        (
            select
                num,
                count(*) times
            from
                MyNumbers
            group by
                num
        ) c
    where
        times = 1
    

    使用having限制:

    select
        max(num) num
    from
        (
            select
                num
            from
                MyNumbers
            group by
                num
            having
                count(*) = 1
        ) c
    

    58. 最后一个单词的长度

    题目链接

    58. 最后一个单词的长度

    标签

    字符串

    Java.split()

    思路

    众所周知,在 J a v a Java Java 中有一个很好的函数,它能按照某个字符串对原字符串进行分割,它就是 S t r i n g String String 中的 s p l i t ( ) split() split() 方法,注意:它会保留空串,例如" hello world".split(" ")将会返回 [ " " , " h e l l o " , " w o r l d " ] ["", "hello", "world"] ["","hello","world"] ,你没有看错,它保留了空串,返回了3个字符串。

    代码

    class Solution {
        public int lengthOfLastWord(String s) {
            String[] strings = s.split(" ");
            return strings[strings.length - 1].length();
        }
    }
    

    不使用Java的API

    思路

    对于求最后一个单词的长度,可以从最后一个不为空格的字符开始计数,直到遇到空格,然后返回这个统计的数即可。

    代码

    class Solution {
        public int lengthOfLastWord(String s) {
            char[] str = s.toCharArray();
    
            // 先遍历到最后一个单词的最后一个字符,去除空格
            int i = str.length - 1;
            while (i >= 0 && str[i] == ' ') {
                i--;
            }
    
            // 统计最后一个单词的字符数
            int cnt = 0;
            while (i >= 0) {
                if (str[i] == ' ') {
                    break;
                }
                cnt++;
                i--;
            }
    
            return cnt;
        }
    }
    

    24. 两两交换链表中的节点

    题目链接

    24. 两两交换链表中的节点

    标签

    递归 链表

    要求

    • 你必须在 不修改节点内部的值 的情况下完成本题(即,只能进行节点交换)

    思路

    先说明几个概念,左节点:待交换的两个节点中的左节点右节点:待交换的两个节点中的右节点前指针:指向待交换的两个节点的指针(为什么需要前指针?因为交换节点不止是两个节点之间的互换,还需要让前指针的指向从 指向左节点 变为 指向右节点。这一点很重要)。

    交换节点分为四步:第一步,让前指针指向右节点;第二步,让左节点指向原本右节点指向的节点;第三步,让右节点指向左节点;第四步,更新前指针到左指针处(因为下一轮交换的是交换后的左指针的 下一个节点 和 下下一个节点)。

    本题依旧采用 哨兵节点指向链表头节点 的方式,因为前指针一开始得指向链表的头节点

    代码

    class Solution {
        public ListNode swapPairs(ListNode head) {
            ListNode sentinel = new ListNode(-1, head); // 哨兵指针,它指向链表的头节点
            ListNode prev = sentinel; // 前指针,它指向待交换的两个节点的左节点
            while (prev.next != null && prev.next.next != null) {
                ListNode left = prev.next;
                ListNode right = prev.next.next;
                prev.next = right; // 让前指针指向右节点
                left.next = right.next; // 让左节点指向原本右节点指向的节点
                right.next = left; // 让右节点指向左节点
                prev = left; // 更新前指针到左指针处
            }
            return sentinel.next;
        }
    }
    
  • 相关阅读:
    漏洞修复实用指南
    设计模式 代理模式
    拓端tecdat|R语言提取时间序列的周期性成分应用EMD,小波滤波器,Baxter过滤器等
    宝塔FTP提示:553 Can‘t open that file: Permission denied的解决方案
    第2-2-2章 常见组件与中台化-常用组件服务介绍-通用权限系统
    牛客题霸 -- 【模板】完全背包
    利用图神经网络进行药物再利用的计算方法(下)
    试验台铁地板技术参数(河北北重北重机械制造厂家)
    MySQL相关知识汇总
    自定义步骤条setup
  • 原文地址:https://blog.csdn.net/qq_61350148/article/details/139668280