第一题 模拟题
这个题就是个模拟题没啥好说的,但是写模拟容易写复杂了,所以,写模拟前一定要想好怎么写,要不然,浪费大量时间不说,代码根本没法改
/** * @Author: Shang Huaipeng */ import java.util.*; public class Solution { public static void main(String[] args) { String add = new Solution().add("25","15.123"); System.out.println(add); } public String add (String num1, String num2) { // write code here String[] s1 = num1.split("\\."); String[] s2 = num2.split("\\."); StringBuilder xiaoshu = new StringBuilder(); int last=0; if(s1.length==1&&s2.length==1){ } else if(s1.length==1){ xiaoshu.append(new StringBuilder(s2[1]).reverse().toString()); } else if(s2.length==1){ xiaoshu.append(new StringBuilder(s1[1]).reverse().toString()); } else{ for(int i=Math.max(s1[1].length(),s2[1].length())-1;i>=0;i--){ int a1=(i<s1[1].length())?s1[1].charAt(i)-'0':0; int a2=(i<s2[1].length())?s2[1].charAt(i)-'0':0; xiaoshu.append((char)((a1+a2+last)%9+'0')); last=(a1+a2+last)/9; } } String zheng1 = new StringBuilder(s1[0]).reverse().toString(); String zheng2 = new StringBuilder(s2[0]).reverse().toString(); StringBuilder zheng = new StringBuilder(); for(int i=0;i<Math.max(zheng1.length(),zheng2.length());i++){ int a1=(i<zheng1.length())?zheng1.charAt(i)-'0':0; int a2=(i<zheng2.length())?zheng2.charAt(i)-'0':0; zheng.append((char)((a1+a2+last)%9+'0')); last=(a1+a2+last)/9; } if(last!=0){ zheng.append((char)(last+'0')); } return zheng.reverse().toString()+(xiaoshu.length()>0?"."+xiaoshu.reverse().toString():""); } }
第二题
算是一个简单的排列组合吧,先将两个数组排序
答案初始为1
在遍历W数组,找到每个工人能够做的任务数
如果任务数小于当前工人的编号,那么说明这个人没法工作,答案为0,
任务数大于等于工人的编号,答案就乘上(任务数-工人前面的人数)(排列组合)
/** * @Author: Shang Huaipeng * @Date: 2020/4/11 19:01 * @Version 1.0 */ import java.io.BufferedInputStream; import java.util.*; public class Main { /* 6 1 6 3 4 5 2 2 3 1 4 6 5 10 */ public static void main(String[] args) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); int n = sc.nextInt(); int w[] = new int[n]; int t[] = new int[n]; int m = 0; for (int i = 0; i < n; i++) { w[i] = sc.nextInt(); } for (int i = 0; i < n; i++) { t[i] = sc.nextInt(); } m = sc.nextInt(); Arrays.sort(w); Arrays.sort(t); int ans = 0; int i = 0; LinkedList<Integer> list = new LinkedList<>(); while (i < n) { int index = lower(t, 0, n, w[i]+1) - 1; if (index < i) { ans = -1; break; } list.add(index + 1); i++; } int tmp = 1; int jian = 0; for (Integer integer : list) { //System.out.println(integer-jian); tmp = (tmp * (integer - jian)) % m; jian++; } ans = (ans + tmp) % m; //System.out.println(ans); if (ans == -1) ans = 0; System.out.println(ans); } static int lower(int nums[], int l, int r, int num) { while (l < r) { int mid = (l + r) / 2; if (nums[mid] >= num) r = mid; else l = mid + 1; } return l; } }
第四题
dp思想
import java.util.*; public class Solution { /* * * @param boxes int整型二维数组 * @return int整型 */ public int maxBoxes (int[][] boxes) { // write code here Arrays.sort(boxes,(o1,o2)->{ if(o1[0]!=o2[0])return o1[0]-o2[0]; if(o1[1]!=o2[1])return o1[1]-o2[1]; return o1[2]-o2[2]; }); int dp[]=new int[boxes.length]; Arrays.fill(dp,1); for(int i=1;i<boxes.length;i++){ int max=0; for(int j=0;j<i;j++){ if(boxes[i][0]>boxes[j][0]&&boxes[i][1]>boxes[j][1]&&boxes[i][2]>boxes[j][2])max=Math.max(dp[j],max); } dp[i]+=max; } int ans=0; for(int i=0;i<boxes.length;i++){ ans=Math.max(ans,dp[i]); } return ans; } }
全部评论
(1) 回帖