# 第五十五周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

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

# Review

# Tip

  • 必须在主线程更新UI的原因:AndroidUI线程不安全
  • Handler机制:
    • Message:线程之间传递的消息
    • Handler:发送与处理消息
    • MessageQueue:消息队列
    • LooperMessageQueue的管家
  • 每一个线程只会有一个MessageQueueLooper
  • runOnUiThread本质上使用了Handler机制
  • AsyncTask的泛型参数:
    • Params:在执行AsyncTask时传入的参数,可在后台任务中使用
    • Progress:后台执行任务时,如需显示进度,则通过该泛型指定进度的单位
    • Result:任务执行完毕返回结果的类型
  • AsyncTask常用方法:
    • onPreExecute主线程:该方法会在后台任务开始执行之前调用,用于进行一些界面初始化操作
    • doInBackground子线程:用于处理所有的耗时任务,如需反馈任务进度,可使用publishProgress来切换到主线程
    • onProgressUpdate主线程:当publicProgress调用后,该方法会被立即调用
    • onPostExecute主线程:后台任务完成后,return之后会调用该方法,可利用返回数据进行一些更新UI的操作

# Share

暂无内容

更新时间: 10/20/2022, 7:04:01 AM