力扣---2020.9.2

tech2022-07-15  145

剑指 Offer 20. 表示数值的字符串

// 状态机转换,有点像编译原理的前端部分的词法分析器部分的代码 class Solution { public boolean isNumber(String s) { if (s == null || s.length() == 0) return false; //去掉首位空格 s = s.trim(); boolean numFlag = false; boolean dotFlag = false; boolean eFlag = false; for (int i = 0; i < s.length(); i++) { //判定为数字,则标记numFlag if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { numFlag = true; //判定为. 需要没出现过.并且没出现过e } else if (s.charAt(i) == '.' && !dotFlag && !eFlag) { dotFlag = true; //判定为e,需要没出现过e,并且出过数字了 } else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) { eFlag = true; numFlag = false;//为了避免123e这种请求,出现e之后就标志为false //判定为+-符号,只能出现在第一位或者紧接e后面 } else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) { //其他情况,都是非法的 } else { return false; } } return numFlag; } }

剑指 Offer 49. 丑数

class Solution { public int nthUglyNumber(int n) { int[] dp = new int[n]; dp[0] = 1; int id2 = 0,id3 = 0,id5 = 0; for (int i = 1; i < n; i++) { dp[i] = Math.min(Math.min(2*dp[id2],3*dp[id3]),5*dp[id5]); //三个链表可能有相同元素,所以只要是最小的,都要移动指针 if (dp[id2]*2 == dp[i]){ id2++; } if (dp[id3]*3 == dp[i]){ id3++; } if (dp[id5]*5 == dp[i]){ id5++; } } return dp[n-1]; } }

剑指 Offer 31. 栈的压入、弹出序列

class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> stack = new Stack<>(); int j = 0; for(int it : pushed){ stack.push(it); while(j < popped.length && !stack.isEmpty() && stack.peek()==popped[j]){ stack.pop(); j++; } } return j == popped.length; // return stack.isEmpty(); } }

你知道的越多,你不知道的越多。

最新回复(0)