2022-2-10数学day4

题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。

上一篇:第一章.概论


下一篇:【题解】Codeforces Round #772 (Div. 2)