目录
619. 只出现一次的最大数字
题目链接
表
- 表
MyNumbers
的字段为num
要求
- 找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null 。
知识点
max()
:取最大值函数。如果一个值都没有,则返回null。count()
:统计个数的函数。group by
:按照某些字段进行分组。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. 最后一个单词的长度
题目链接
标签
字符串
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. 两两交换链表中的节点
题目链接
标签
递归 链表
要求
- 你必须在 不修改节点内部的值 的情况下完成本题(即,只能进行节点交换)
思路
先说明几个概念,左节点:待交换的两个节点中的左节点,右节点:待交换的两个节点中的右节点,前指针:指向待交换的两个节点的指针(为什么需要前指针?因为交换节点不止是两个节点之间的互换,还需要让前指针的指向从 指向左节点 变为 指向右节点。这一点很重要)。
交换节点分为四步:第一步,让前指针指向右节点;第二步,让左节点指向原本右节点指向的节点;第三步,让右节点指向左节点;第四步,更新前指针到左指针处(因为下一轮交换的是交换后的左指针的 下一个节点 和 下下一个节点)。
本题依旧采用 哨兵节点指向链表头节点 的方式,因为前指针一开始得指向链表的头节点。
代码
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;
}
}