1. 判断子序列

image-20200727092718611

我的思路:双指针

建立两个指针 i,j,分别指向 s 和 t

  • s.charAt(i) == t.charAt(j) 时,两个指针均向后移动一位
  • 否则,只将 j 后移一位

循环结束后,如果 i 等于 s 的长度,说明指针遍历过整个字符串 s,均找到 t 中与之相等的字母,故返回 true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public boolean isSubsequence(String s, String t) {
int i = 0, j = 0;
while (i < s.length() && j < t.length()) {
if (s.charAt(i) == t.charAt(j)) {
i++;
j++;
} else {
j++;
}
}
if (i == s.length()) return true;
else return false;
}
}
image-20200727093155189

更快的方法

遍历 s 中的字符,用 t.indexOf() 方法查询字符串 t 中是否含有该字符

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public boolean isSubsequence(String s, String t) {
int index = -1;
for (char c : s.toCharArray()){
// 第一个参数:要查找的字符
// 第二个参数:查找的起始位置
index = t.indexOf(c, index+1);
// indexOf() 如果没找到,则返回 -1
if (index == -1) return false;
}
return true;
}
}

2. 快乐数

image-20200727100806469

我的思路:递归(失败)

求出 n 的下一个数 next ,带入函数 isHappy(next)

存在问题:无法确定返回 false 的条件,如果结果是 true 则可直接返回,是 false 将出现 StackOverflowError

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public boolean isHappy(int n) {
int res = 0;
while (n > 0) {
int temp = n % 10;
res += (temp * temp);
n /= 10;
}
if (res == 1) return true;
else return isHappy(res);
}
}
image-20200727101111995

官方思路一:HashSet检测循环

直接贴代码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {

// 按照规则求出 n 的下一个数
private int getNext(int n) {
int totalSum = 0;
while (n > 0) {
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}

public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
// 如果 set 中包含 n ,则说明进入了循环
while (n != 1 && !seen.contains(n)) {
seen.add(n);
n = getNext(n);
}
return n == 1;
}
}

/*
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

官方思路二:快慢指针检测循环

直接贴代码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {

// 按照规则求出 n 的下一个数
public int getNext(int n) {
int totalSum = 0;
while (n > 0) {
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}

public boolean isHappy(int n) {
int slowRunner = n;
int fastRunner = getNext(n);
// 慢指针移动一次,快指针移动两次
// 当快指针和慢指针相同时,说明进入了循环
while (fastRunner != 1 && slowRunner != fastRunner) {
slowRunner = getNext(slowRunner);
fastRunner = getNext(getNext(fastRunner));
}
return fastRunner == 1;
}
}

/*
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

3. 移除链表元素

image-20200727103654392

思路

设置一个哨兵节点,哨兵节点的 next 指向头节点

设置一个 pre 节点,记录当前节点 cur 的上一个节点

  • cur.val == valpre.next = cur.next
  • 否则:pre = cur

cur 指向下一个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode sentinel = new ListNode(0);
sentinel.next = head;

ListNode pre = sentinel, cur = head;
while (cur != null) {
if (cur.val == val) pre.next = cur.next;
else pre = cur;
cur = cur.next;
}
return sentinel.next;
}
}

4. 计数质数

image-20200727105615429

思路

如求10之内的质数,首先列出2~N-1的所有数,如果当前数为质数,则其倍数就是质数,如

第一个质数为2,在2上画圈,其倍数4/6/8不是质数,划掉4/6/8,继续遍历
下一个质数为3,在3上画圈,其倍数6/9不是质数,划掉6/9,继续遍历
下一个质数为5,在5上画圈,没有倍数,继续遍历
下一个质数为7,在7上画圈,没有倍数,继续遍历。
最后再次遍历整个数组,画圈的数字就是质数,即2,3,5,7

转换为代码就是如果需要求<n的所有质数个数,则创建一个长度为n的整数数组,所有元素值变为1,1表示对应的索引值为质数,0表示对应的索引值为非质数。从2开始遍历,如果当前数字值为1,则获取其所有倍数,将元素值变为0(标记为非质数)。遍历完成后再次遍历数组,从2开始,记录元素为1的个数,即为对应的质数个数。

作者:mmmmmJCY
链接:https://leetcode-cn.com/problems/count-primes/solution/e-la-duo-sai-shai-fa-qiu-zhi-shu-java-by-zxy0917/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public int countPrimes(int n) {
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = 1;
}
for (int i = 2; i < n; i++) {
//如果当前数为质数
if (nums[i] == 1) {
//将对应数的倍数变为0
for (int j = 2; i * j < n; j++) {
nums[i * j] = 0;
}
}
}
//遍历数组,统计值为1的元素个数
int res = 0;
for (int i = 2; i < n; i++) {
if (nums[i] == 1)
res++;
}
return res;
}

/*
作者:mmmmmJCY
链接:https://leetcode-cn.com/problems/count-primes/solution/e-la-duo-sai-shai-fa-qiu-zhi-shu-java-by-zxy0917/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/