2042-检查句子中的数字是否递增
...
这道题还是挺简单的,上代码:
public boolean areNumbersAscending(String s) {
String[] str = s.split(" ");
List<Integer> list = Arrays.stream(str).filter(e -> Character.isDigit(e.charAt(0))).map(Integer::valueOf).collect(Collectors.toList());
for (int i = 0; i < list.size()-1; i++) {
if (list.get(i) >= list.get(i+1)) {
return false;
}
}
return true;
}
提交后发现,耗时长达3ms,击败27.8%。效率有点低。看了官方题解,自己尝试后ac了。在此记录一下。
经验:需要多关注提示,关注入参范围。有些情况下这是提升算法效率的关键。
改进后的代码如下:
public boolean areNumbersAscending(String s) {
int pre = 0, pos = 0;
while (pos < s.length()) {
if (Character.isDigit(s.charAt(pos))) {
int cur = 0;
while (pos < s.length() && Character.isDigit(s.charAt(pos))) {
cur = cur * 10 + s.charAt(pos) - '0';
pos++;
}
if (cur <= pre) {
return false;
}
pre = cur;
} else {
pos++;
}
}
return true;
}
思路:使用pre
表示上一个数字,pos
表示当前遍历的下标。
在循环中,判断当前下标pos
处的是不是数字,如果不是,pos++
。如果是,先把cur
(当前数字)初始化为0。然后进入内层while
循环。只要下标pos
在范围内,且当前字符是数字,则更新cur,pos++。
退出内层循环后判断,如果当前数<=上一个数,返回false
。否则,把cur
赋给pre
。然后继续下一个外层循环。
在循环结束后,返回true
。
时间复杂度:O(n)
。其中n
表示字符串的长度。我们只需遍历一遍字符串即可。
空间复杂度:O(1)
。仅用到若干额外变量。
你认为这篇文章怎么样?
- 0很棒
- 0不错
- 0一般
- 0???