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;
    }
}

相关推荐

  1. leetcode

    2024-06-18 06:48:02       39 阅读
  2. leetcode

    2024-06-18 06:48:02       38 阅读
  3. leetcode

    2024-06-18 06:48:02       37 阅读
  4. LeetCode

    2024-06-18 06:48:02       20 阅读
  5. leetcode

    2024-06-18 06:48:02       11 阅读
  6. Leetcode -2

    2024-06-18 06:48:02       34 阅读
  7. Leetcode】计算器

    2024-06-18 06:48:02       42 阅读
  8. LeetCode 45

    2024-06-18 06:48:02       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 06:48:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 06:48:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 06:48:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 06:48:02       20 阅读

热门阅读

  1. 随机梯度下降(SGD)

    2024-06-18 06:48:02       9 阅读
  2. 【shell脚本个人随笔记录】

    2024-06-18 06:48:02       6 阅读
  3. c++ | 动态编译|虚函数表|虚函数

    2024-06-18 06:48:02       10 阅读