算法刷题1
suichentree 5/8/2021 算法/数据结构
# 基础
# 两数之和(简单)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
java 解法
public int[] twoSum(int[] nums, int target) {
int size = nums.length;
//运用冒泡法的思想,暴力破解
for(int i=0;i<size -1;i++){
for(int j=i+1;j<size;j++){
if(nums[i] + nums[j] == target){
return new int[]{i,j};
}
}
}
return null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 整数反转(简单)
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
提示:
-2^31 <= x <= 2^31 - 1
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
java 解法
//两数相加
//注意点:反转后超过int的最大最小值,就返回0
//思路:int的最大数为2147483647,若反转则为7463847412,绝对超过了int的存储范围,所以反转后的数要用long存储
public int reverse(int x) {
long rsum = 0;
while(x!=0){
int a = x % 10;
rsum = rsum*10 + a;
x = x/10;
}
if(rsum> Integer.MAX_VALUE || rsum < Integer.MIN_VALUE){
return 0;
}else{
return (int)rsum;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 回文数(简单)
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java 解法
public boolean isPalindrome(int x) {
int a = x;
//负数不是回文数
if(x<0){
return false;
}
//通过的逆序的方式来判断是否是回文数
int r_num = 0;
while(x!=0){
r_num = r_num*10 + x%10;
x = x/10;
}
if(r_num == a){
return true;
}else {
return false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 罗马数字转整数(简单)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: "III"
输出: 3
示例 2:
输入: "IV"
输出: 4
示例 3:
输入: "IX"
输出: 9
示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
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
33
34
35
36
37
38
39
40
41
42
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
33
34
35
36
37
38
39
40
41
42
java解法:
//思路:读取单个字符,转换为对应的数值,相加起来。
//pre_char记录当前字符的上一个字符是什么
// IV = (1+5)-2*1 = 4
// IX = (1+10)-2*1 = 9
// XL = (10 + 50) - 2*10 = 40
public int romanToInt(String s) {
char[] chars = s.toCharArray();
int sum = 0;
char pre_char = '0';
for(int i=0;i<chars.length;i++){
switch (chars[i]){
case 'I':
sum += 1;
pre_char = 'I';
break;
case 'V':
sum += 5;
//若V的左边字符是I
if(pre_char == 'I'){
sum -= 2;
}
pre_char = 'V';
break;
case 'X':
sum += 10;
if(pre_char == 'I'){
sum -= 2;
}
pre_char = 'X';
break;
case 'L':
sum += 50;
if(pre_char == 'X'){
sum -= 20;
}
pre_char = 'L';
break;
case 'C':
sum += 100;
if(pre_char == 'X'){
sum -= 20;
}
pre_char = 'C';
break;
case 'D':
sum += 500;
if(pre_char == 'C'){
sum -= 200;
}
pre_char = 'D';
break;
case 'M':
sum += 1000;
if(pre_char == 'C'){
sum -= 200;
}
pre_char = 'M';
break;
}
}
return sum;
}
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 最长公共前缀(简单)
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java解法
public String longestCommonPrefix(String[] strs) {
//解题思路:
//取出第一个字符串的第1个字符,与其他字符串上的第1个字符比较,若都相等。则继续。并存入到一个临时变量中
//取出第一个字符串的第n个字符,与其他字符串对应位置比较,若相等,则继续。若不相等,则之前比较的就是最长公共前缀
//注意:若第一个字符串字符个数不是最小的,则容易出现读取其他字符串某个字符时,会出现读取越界异常。此时抛出异常,并退出循环即可。
//第一个字符串字符个数
char[] chars = strs[0].toCharArray();
int length = chars.length;
//数组中字符串个数
int size = strs.length;
//判断字符串对应位置的字符是否相等
boolean isEquals = true;
//存储最长公共前缀的变量
StringBuffer sb = new StringBuffer();
//循环。次数为第一个字符串的字符个数
//若其他字符串的字符个数小于这个数,容器发送读取异常。需抛出异常
for(int i=0;i<length;i++){
//若出现下标越界异常则直接结束程序
try{
//取出第一个字符串的第n个字符
char a = strs[0].charAt(i);
//将字符a与其他字符串对应位置字符比较
//不用自己比较自己,所以j=1
for(int j=1;j<size;j++){
if(a != strs[j].charAt(i)){
isEquals = false;
}
}
//判断对应位置的字符是否全部相等。
if(isEquals){
sb.append(a);
}
}catch (Exception e){
break;
}
}
return sb.toString();
}
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
33
34
35
36
37
38
39
40
41
42
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
33
34
35
36
37
38
39
40
41
42
# 有效的括号(简单)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
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
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
java解法1
public boolean isValid(String s) {
//解题思路,通过栈来存储这个字符串
//遇到左括号,则把该左括号入栈,遇到右括号,则判断栈顶元素是否是对应的左括号。若对应,则栈顶元素出栈。若不对应则把右括号入栈
//字符串有效的条件:1.读取完字符串后栈是否为空
//注意点:每次读取栈顶元素时,需要先判断栈是否为空
//创建栈
Stack stack = new Stack();
//将字符串转换为字符数组
char[] chars = s.toCharArray();
//存储栈顶字符
char a;
//循环
for(int i=0;i<chars.length;i++){
switch (chars[i]){
case '(':
stack.push('(');
break;
case '[':
stack.push('[');
break;
case '{':
stack.push('{');
break;
case ')':
//判断栈是否为空
if(!stack.isEmpty()){
a = (char) stack.peek();
//判断栈顶元素是否为对应的左括号
if(a == '('){
stack.pop();
}else{
stack.push(')');
}
}else{
//若栈为空,则直接入栈
stack.push(')');
}
break;
case ']':
if(!stack.isEmpty()){
a = (char) stack.peek();
if(a == '['){
stack.pop();
}else{
stack.push(']');
}
}else{
stack.push(']');
}
break;
case '}':
if(!stack.isEmpty()){
a = (char) stack.peek();
if(a == '{'){
stack.pop();
}else{
stack.push('}');
}
}else{
stack.push('}');
}
break;
}
}
//判断字符串是否有效
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
java解法2
public boolean isValid(String s) {
//解题思路,通过栈来存储这个字符串
//遇到左括号,则把该左括号入栈,遇到右括号,则判断栈顶元素是否是对应的左括号。若对应,则栈顶元素出栈。若不对应则字符串无效
//字符串有效的条件:1.读取右括号时栈顶元素是否为对应的左括号。2,读取完字符串后栈是否为空
//注意点:每次读取栈顶元素时,需要先判断栈是否为空
//创建栈
Stack stack = new Stack();
//将字符串转换为字符数组
char[] chars = s.toCharArray();
//判断字符串是否有效
boolean isOk = true;
//存储栈顶字符
char a;
//循环
for(int i=0;i<chars.length;i++){
switch (chars[i]){
case '(':
stack.push('(');
break;
case '[':
stack.push('[');
break;
case '{':
stack.push('{');
break;
case ')':
//判断栈是否为空
if(!stack.isEmpty()){
a = (char) stack.peek();
//判断栈顶元素是否为对应的左括号
if(a == '('){
stack.pop();
}else{
isOk = false;
}
}else{
isOk = false;
}
break;
case ']':
if(!stack.isEmpty()){
a = (char) stack.peek();
if(a == '['){
stack.pop();
}else{
isOk = false;
}
}else{
isOk = false;
}
break;
case '}':
if(!stack.isEmpty()){
a = (char) stack.peek();
if(a == '{'){
stack.pop();
}else{
isOk = false;
}
}else{
isOk = false;
}
break;
}
}
//判断字符串是否有效。先判断栈是否为空
if(stack.isEmpty()){
if(isOk){
return true;
}else{
return false;
}
}else{
return false;
}
}
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 删除有序数组中的重复项(简单)
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
java解法
public class test1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
test1 s = new test1();
int[] strs = {0,0,1,1,1,2,2,3,3,4};
System.out.println(s.removeDuplicates(strs));
}
public int removeDuplicates(int[] nums) {
//由于是有序数组,元素依此递增。
//通过快慢指针来实现,快指针用于遍历该数组,慢指针指向最后一个索引,即新数组的长度
//当慢指针与快指针指向的值相等时,慢指针+1,并且慢指针指向的值改为快指针指向的值
int slow=0;
for (int fast=0;fast<nums.length;fast++){
if(nums[fast] != nums[slow]) {
slow ++;
nums[slow] = nums[fast];
}
}
return slow+1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 移除元素(简单)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
java解法
public class test1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
test1 s = new test1();
int[] strs = {0,1,2,2,3,0,4,2};
System.out.println(s.removeElement(strs,2));
}
public int removeElement(int[] nums, int val) {
//通过快慢指针来实现,快指针用于遍历该数组,慢指针表示新数组的长度
//当快指针指向的值与值val不相等时,将此时快指针指向的值赋值给慢指针所指的元素.并且慢指针自身前进一位
int slow=0;
for (int fast=0;fast<nums.length;fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow ++;
}
}
return slow;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 实现strStr(),母串和子串的匹配问题(简单)
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0
提示:
0 <= haystack.length, needle.length <= 5 * 104
haystack 和 needle 仅由小写英文字符组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
java解法
public class test1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
test1 s = new test1();
String haystack = "hello";
String needle = "ll";
System.out.println(s.strStr(haystack,needle));
}
public int strStr(String haystack, String needle) {
//思路:母串的每个字符都与子串的第一个字符进行比较。
// 若相同,则从该字符索引处开始逐个与子串比较,若有一处不同,则母串与子串不匹配
// 注意:由于母串能包含子串,所以遍历母串的索引从0 到 (母串长度-子串长度)为止。后面不用再次比较了,因为长度不够容纳子串了
int a = haystack.length();
int b = needle.length();
//若子串长度为0,返回0
if(b==0){
return 0;
}
//若子串长度大于母串,则表示母串内无子串。返回-1
if(b>a){
return -1;
}
int index = -1;
for(int i=0;i<=a-b;i++){
if(haystack.charAt(i) == needle.charAt(0)){
boolean isHave = true;
for(int j=0;j<b;j++){
if(haystack.charAt(i+j) != needle.charAt(j)){
isHave = false;
break;
}
}
if(isHave){
index = i;
return index;
}
}
}
return index;
}
}
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
33
34
35
36
37
38
39
40
41
42
43
44
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
33
34
35
36
37
38
39
40
41
42
43
44
# 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java解法
public int searchInsert(int[] nums, int target) {
//排序数组,元素从小到大
//遍历该数组,遇到与目标值相等的元素,返回索引。
//遇到小于目标值的继续遍历,大于目标值的元素,返回该处索引-1
//若目标值小于数组中全部元素,则将其插入到数组第一个位置,返回索引0
//若目标值大于数组中全部元素,则将其新增到数组末尾,返回最后一个位置的索引
int index=0;
//若目标值小于数组中全部元素
if(target<=nums[0]){
return 0;
}
//若目标值大于数组中全部元素
if(target>nums[nums.length-1]){
return nums.length;
}
//其他情况
for(int i=0;i<nums.length;i++){
if(nums[i] >= target){
index = i;
break;
}
}
return index;
}
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
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
# 最大子序和(简单)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [0]
输出:0
示例 4:
输入:nums = [-1]
输出:-1
示例 5:
输入:nums = [-100000]
输出:-100000
提示:
1 <= nums.length <= 3 * 104
-105 <= nums[i] <= 105
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
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
java解法
1
2
3
2
3
# 最后一个单词的长度(简单)
给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = "Hello World"
输出:5
示例 2:
输入:s = " "
输出:0
提示:
1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
java解法
public int lengthOfLastWord(String s) {
//思路:1. 从后往前遍历,遇到单词就+1,遇到空格就退出循环
//注意:若最后一次字符为空格的时候,不退出循环,继续遍历
int last_word_size = 0;
if(s.length() == 0){
return 0;
}
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i) != ' '){
last_word_size ++;
}else{
//读取到空格
if(last_word_size != 0){
break;
}else{
//若最后一次字符为空格的时候,不退出循环,继续遍历
}
}
}
return last_word_size;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 链表
# 合并两个有序链表(简单)
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java解法
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//思路:创建一个新链表,每次比较l1和l2链表中小的那个,把值取出来存入新链表中
// 头指针head,索引指针p
ListNode head = null;
ListNode p = new ListNode();
head = p;
if(l1 == null){
return l2;
}else if(l2 == null){
return l1;
}
//创建新的节点,把值存入节点中
//把新节点设置为链表的下一个节点
//索引指针p指向新节点
while(l1 != null && l2 !=null){
ListNode aNode = new ListNode();
if(l1.val <= l2.val){
aNode.val = l1.val;
l1 = l1.next;
}else{
aNode.val = l2.val;
l2 = l2.next;
}
p.next = aNode;
p = p.next;
}
//当l1或l2链表其中一个为空时,就把另一个链表直接拼接在新链表后面
if(l1 == null){
p.next = l2;
}else{
p.next = l1;
}
//新链表的第一个节点没存值,所以返回新链表的第二个节点
return head.next;
}
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
33
34
35
36
37
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
33
34
35
36
37