# 第五十五周ARTS总结
# Algorithm
3ms | 39.99% Run time
39.6MB | 54.66% Memory
public boolean isNumber(String s) {
// 去除左右的空格
s = s.trim();
// 空判断
if (s.length() == 0) {
return false;
}
// e在开头或者结尾都不是数字
if (s.charAt(0) == 'e' || s.charAt(s.length() - 1) == 'e') {
return false;
}
// 判断字符是否满足条件
for (char ch : s.toCharArray()) {
boolean isMatter = (ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == 'e' || ch == '.';
if (!isMatter) {
return false;
}
}
String[] splits = s.split("e");
// 此时不止一个e
if (splits.length > 2) {
return false;
} else if (splits.length == 2) {
// split[1]必须为整数,split[0]必须为数字
if (getType(splits[0]) != 0 && getType(splits[1]) == 1) {
return true;
} else {
return false;
}
} else {
if (getType(splits[0]) != 0) {
return true;
} else {
return false;
}
}
}
/**
* 判断s的类型
* 注意:.1 和 1. 都算小数,但是 . 不是小数
*
* @param s
* @return 0:非数字; 1:整数; 2:小数
*/
private int getType(String s) {
if (s.length() == 0) {
return 0;
}
// 是否包含数字
boolean containDigit = false;
// 小数点的索引
int pointIndex = -1;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
// 判断正负号
if (ch == '+' || ch == '-') {
// 当存在正负号不在首位时,s必定非数字
if (i > 0) {
return 0;
}
}
// 判断小数点
if (ch == '.') {
// 此时有复数个小数点
if (pointIndex >= 0) {
return 0;
} else {
pointIndex = i;
}
}
// 是否包含数字
if (!containDigit && ch >= '0' && ch <= '9') {
containDigit = true;
}
}
if (!containDigit) {
return 0;
}
if (pointIndex == -1) {
return 1;
} else {
return 2;
}
}
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
0ms | 100.00% Run time
37.7MB | 89.06% Memory
public int[] plusOne(int[] digits) {
int carry = 1;
for (int i = digits.length - 1; i >= 0; i--) {
digits[i] = digits[i] + carry;
carry = digits[i] / 10;
digits[i] = digits[i] % 10;
if (carry == 0) {
break;
}
}
if (carry > 0) {
int[] ans = new int[digits.length + 1];
ans[0] = carry;
System.arraycopy(digits, 0, ans, 1, digits.length);
return ans;
} else {
return digits;
}
}
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
# Review
# Tip
- 必须在主线程更新UI的原因:Android的UI线程不安全
- Handler机制:
- Message:线程之间传递的消息
- Handler:发送与处理消息
- MessageQueue:消息队列
- Looper:MessageQueue的管家
- 每一个线程只会有一个
MessageQueue
和Looper
- runOnUiThread本质上使用了Handler机制
- AsyncTask的泛型参数:
- Params:在执行AsyncTask时传入的参数,可在后台任务中使用
- Progress:后台执行任务时,如需显示进度,则通过该泛型指定进度的单位
- Result:任务执行完毕返回结果的类型
- AsyncTask常用方法:
- onPreExecute:主线程:该方法会在后台任务开始执行之前调用,用于进行一些界面初始化操作
- doInBackground:子线程:用于处理所有的耗时任务,如需反馈任务进度,可使用publishProgress来切换到主线程
- onProgressUpdate:主线程:当publicProgress调用后,该方法会被立即调用
- onPostExecute:主线程:后台任务完成后,return之后会调用该方法,可利用返回数据进行一些更新UI的操作
# Share
暂无内容