商汤研发笔试 100-100-20-100
关于第三题,始终没有找到正确的计算姿势,有dalao指教一下么
1
package Interview2020.SenseTime._1;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] ss = s.split(" ");
Stack<Integer> stack = new Stack<>();
for(String t : ss){
if(isCal(t)){
int a2 = stack.pop();
int a1 = stack.pop();
if(t.equals("+")) stack.push(a1+a2);
else if(t.equals("-")) stack.push(a1-a2);
else if(t.equals("*")) stack.push(a1*a2);
else if(t.equals("/")) stack.push(a1/a2);
}
else{
stack.push(Integer.valueOf(t));
}
}
System.out.println(stack.peek());
}
private static boolean isCal(String s){
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"))
return true;
return false;
}
}
2
package Interview2020.SenseTime._2;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] nums = new int[N];
for(int i=0; i < N; i++){
nums[i] = sc.nextInt();
}
int max = 0;
for(int i=1; i < N-1; i++){
int left = i;
int right = i;
while(left-1 >=0 && nums[left] > nums[left-1]) left--;
while(right+1 < N && nums[right] > nums[right+1]) right++;
if(right - left + 1 >= 3 && left < i && right > i)
max = Math.max(right-left+1,max);
}
System.out.println(max);
}
}
3
package Interview2020.SenseTime._3;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int[] dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
int ini = sc.nextInt();
//尝试暴力计算
dp = new int[year+1];
dp[0] = ini;
for(int i=1; i <= year; i++){
int part1 = (a * helper(i-1))%1000000007;
int part2 = (b * helper(i-2))%1000000007;
int part3 = (c * helper(i-3))%1000000007;
int part40 = (2*i)%1000000007;
int part41 = (part40*i)%1000000007;
int part42 = (part41-i)%1000000007;
int part43 = (part42+32767)%1000000007;
int part4 = part43;
int p1 = (part1+part2)%1000000007;
int p2 = (p1+part3)%1000000007;
int p3 = (p2+part4)%1000000007;
dp[i] = p3;
}
System.out.println(dp[year]);
}
private static int helper(int i){
if(i < 0)
return 0;
return dp[i];
}
}
4
package Interview2020.SenseTime._4;
import java.util.*;
public class Main {
private static int res = 0;
private static Set<String> set = new HashSet<>();
private static Set<Integer> sqrt = new HashSet<>();
private static List<List<Integer>> used = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i=0; i < n; i++){
nums[i] = sc.nextInt();
}
if(n == 1){
System.out.println(res);
return;
}
calculate();
permutation(nums,0);
System.out.println(res);
}
private static void calculate(){
for(int i=0; i <= 100; i++){
sqrt.add(i*i);
}
}
private static boolean isValid(int[] nums){
for(int i=0; i < nums.length-1; i++){
if(!sqrt.contains(nums[i]+nums[i+1]))
return false;
}
return true;
}
private static void permutation(int[] nums,int beginIndex){
if(beginIndex == nums.length){
String s = "";
for(int i=0; i < nums.length; i++){
s += String.valueOf(nums[i]);
}
if(!set.contains(s)){
set.add(s);
if(isValid(nums)){
res++;
}
}
// boolean isSame = false;
// for(int i=0; i < used.size(); i++){
// List<Integer> t = used.get(i);
// isSame = true;
// for(int j=0; j < t.size(); j++){
// if(t.get(j) != nums[j]){
// isSame = false;
// break;
// }
// }
// if(isSame) break;
// }
// if(!isSame){
// if(isValid(nums)) res++;
// }
// List<Integer> tt = new ArrayList<>();
// for(int i=0; i < nums.length; i++) tt.add(nums[i]);
// used.add(tt);
}
for(int curIndex=beginIndex; curIndex < nums.length; curIndex++){
swap(nums,curIndex,beginIndex);
permutation(nums,beginIndex+1);
swap(nums,curIndex,beginIndex);
}
}
private static void swap(int[] nums,int i, int j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
#笔试题目##商汤科技#