顺时针打印矩阵
使用递归,先处理周围一圈,然后进入内部小矩阵,
1 | import java.util.ArrayList; |
连续扑克牌
- 直接思路
对数组排序,如果有相同的非零元素,直接返回false
计算0元素的个数,找到非零元素开始的位置
归纳发现,如果非零元素的相邻差小于允许的值,就是连续的
允许的值maxDelta = numbers.length - zeroNumber - 1 + zeroNumber;
允许的值,发现非零元素作差如果比非零元素的数量少1,则正好是连续的,如果有0元素的存在,一个0元素可以当作任意元素,填充到相应位置,弥补一个差值
1 | public boolean IsContinuous(int [] numbers) { |
- 优化
零元素的个数,就是非零元素开始索引的位置
发现增加一个0元素,最大允许的相邻差值增加1
但是同时,由于计算相邻差值的非零元素减少了一个,计算的总相邻差值也会减少1,最大允许的相邻差值减少1
所以总体上没变
maxDelta = numbers.length - 1
1 | public boolean IsContinuous(int [] numbers) { |
字符串转成整数
- 直接思路
- 先除去空格,除去后如果为空直接返回0
- 提取符号位,判断是否为负数
- 提取开头的连续数字
- 除去开头的0
- 转成数字
- 10位数以上直接截断
- 10位数超过整型范围,直接截断
- 剩下的都是整型范围内,转成整型
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
79public int StrToInt (String s) {
// 除去空格
s = s.trim();
// 提取空格后如果为空直接返回0
if (s.length() == 0) {
return 0;
}
// 提取符号位
boolean isNegative = false;
if (s.charAt(0)=='-' || s.charAt(0)=='+') {
if (s.charAt(0) == '-') {
isNegative = true;
}
if (s.length() == 1) {
return 0;
}
s = s.substring(1);
}
// 只提取开头连续的纯数字
s = this.getNumber(s);
// 除去开头的0
s = this.removeStartZero(s);
// 总体上分两种情况 10位数(含)以下和10位数以上
if (s.length() <= 10) {
// 等于10位数的时候,利用compareTo方法判断是否在整形范围内,如果不在则返回最大或最小值
if (s.length() == 10) {
if (isNegative) {
String minString = ("" + Integer.MIN_VALUE).substring(1);
if (s.compareTo(minString) >= 0) {
return Integer.MIN_VALUE;
}
} else {
String maxString = "" + Integer.MAX_VALUE;
if (s.compareTo(maxString) >= 0) {
return Integer.MAX_VALUE;
}
}
}
// 在整型范围内的,转成整形
if (isNegative) {
return -this.toInt(s);
} else {
return this.toInt(s);
}
}
//10位数以上返回最大值或最小值
else {
if (isNegative) {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
}
// 提取开头的连续数字
private String getNumber(String s) {
int i=0;
while (i<s.length() && s.charAt(i)>='0' && s.charAt(i)<='9') {
i++;
}
return s.substring(0, i);
}
// 出去开头的0
private String removeStartZero(String s) {
int i=0;
while (i<s.length() && s.charAt(i)=='0') {
i++;
}
return s.substring(i);
}
// 转成整型
private int toInt(String s) {
int n = 0;
for (int i=0; i<s.length(); i++) {
n *= 10;
n += s.charAt(i) - '0';
}
return n;
}