题1:
227. 基本计算器 II
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2" 输出:7
示例 2:
输入:s = " 3/2 " 输出:1
示例 3:
输入:s = " 3+5 / 2 " 输出:5
提示:
1 <= s.length <= 3 * 105
-
s
由整数和算符('+', '-', '*', '/')
组成,中间由一些空格隔开 -
s
表示一个 有效表达式 - 表达式中的所有整数都是非负整数,且在范围
[0, 231 - 1]
内 - 题目数据保证答案是一个 32-bit 整数
1 class Solution { 2 public int calculate(String s) { 3 Stack<Integer> stack=new Stack<>(); 4 char sign='+'; 5 int temp=0; 6 for (int i=0;i<s.length();i++) { 7 char c=s.charAt(i); 8 if (Character.isDigit(c)){ 9 temp=temp*10+(c-'0'); 10 } 11 if (!Character.isDigit(c)&&c!=' '||i==s.length()-1){ 12 if (sign=='+') { 13 stack.push(temp); 14 }else if (sign=='-') { 15 stack.push(-temp); 16 }else if (sign=='*') { 17 stack.push(stack.pop()*temp); 18 }else stack.push(stack.pop()/temp); 19 20 sign=c; 21 temp=0; 22 } 23 } 24 int ans=0; 25 while (!stack.isEmpty()) { 26 ans+=stack.pop(); 27 } 28 return ans; 29 } 30 }
思路:利用栈的思想,sign记录数字前面的符号,乘除直接与栈顶数字结合,然后将新的数字进栈,最后将栈内所有结果加起来。
题2:
659. 分割数组为连续子序列
给你一个按升序排序的整数数组 num
(可能包含重复数字),请你将它们分割成一个或多个长度至少为 3 的子序列,其中每个子序列都由连续整数组成。
如果可以完成上述分割,则返回 true
;否则,返回 false
。
示例 1:
输入: [1,2,3,3,4,5] 输出: True 解释: 你可以分割出这样两个连续子序列 : 1, 2, 3 3, 4, 5
示例 2:
输入: [1,2,3,3,4,4,5,5] 输出: True 解释: 你可以分割出这样两个连续子序列 : 1, 2, 3, 4, 5 3, 4, 5
示例 3:
输入: [1,2,3,4,4,5] 输出: False
提示:
1 <= nums.length <= 10000
1 class Solution { 2 public boolean isPossible(int[] nums) { 3 // count map 记录数字的数量 4 // need 记录 拼接需要的数量 5 Map<Integer,Integer> count=new HashMap<>(); 6 Map<Integer,Integer> need=new HashMap<>(); 7 for (int i:nums) count.put(i,count.getOrDefault(i,0)+1); 8 for (int x:nums) { 9 // 没有该数字了 10 if (count.get(x)==0) continue; 11 // 拼接在前面序列的背后 12 if (need.containsKey(x)&&need.get(x)>0) { 13 count.put(x,count.getOrDefault(x,0)-1); 14 need.put(x,need.get(x)-1); 15 need.put(x+1,need.getOrDefault(x+1,0)+1); 16 // 从x开头拼成序列 17 }else if (count.get(x)>0&&count.getOrDefault(x+1,0)>0&&count.getOrDefault(x+2,0)>0){ 18 count.put(x,count.get(x)-1); 19 count.put(x+1,count.get(x+1)-1); 20 count.put(x+2,count.get(x+2)-1); 21 need.put(x+3,need.getOrDefault(x+3,0)+1); 22 }else return false; 23 } 24 return true; 25 } 26 }
思路:贪心。优先考虑将数字拼在子序列后面,其次考虑新建一个长度为3的子序列。利用count记录数字的数量,need记录需要的数量,如果need>0则数量-1,need-1,下一个数字need+1。否则,连续3个数字数量-1,第四个数字need+1。