日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我胡汉三又回来了之拼多多笔试复盘

發布時間:2024/1/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我胡汉三又回来了之拼多多笔试复盘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

天朗氣清,惠風和暢。一個陽光明媚的日子,王豆子終于想起了被leetcode支配的恐懼以及TA的csdn賬號,又回來了。
筆記本寫不下了,所以用博客記錄一下。

今天復盤一下拼多多的筆試,第一個題比較簡單懶得復盤了。那么主要看下本菜雞不會的題吧。


  • 食堂吃飯
    分中餐和晚餐, 每一餐又分若干種套餐. 每種套餐有熱量和美味值兩個屬性. 每餐最多只能選一種套餐(可不吃). 問在滿足能量值的情況下, 最少攝入的熱量. 返回最少的熱量, 如果不能達到美味值則返回-1.
  • public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int t = sc.nextInt();//key降序排列TreeMap<Integer,Integer> lunchMap = new TreeMap<>(((o1,o2)->o2-o1));TreeMap<Integer,Integer> dinnerMap = new TreeMap<>(((o1,o2)->o2-o1));for(int i =0;i<n;i++){int hot = sc.nextInt();int beauty = sc.nextInt();if(lunchMap.containsKey(beauty) && lunchMap.get(beauty)<=hot) continue;lunchMap.put(beauty,hot);}for(int i =0;i<m;i++){int hot = sc.nextInt();int beauty = sc.nextInt();if(dinnerMap.containsKey(beauty) && dinnerMap.get(beauty)<=hot) continue;dinnerMap.put(beauty,hot);}int[][] lunch = new int[lunchMap.size()][2];int[][] dinner = new int[dinnerMap.size()][2];int i =lunch.length-1;int minHot = Integer.MAX_VALUE;for(Integer beauty:lunchMap.keySet()){minHot = Math.min(minHot,lunchMap.get(beauty));lunch[i--] = new int[]{beauty,minHot};}i = dinner.length-1;minHot = Integer.MAX_VALUE;for(Integer beauty:dinnerMap.keySet()){minHot = Math.min(minHot,dinnerMap.get(beauty));dinner[i--]= new int[]{beauty,minHot};}int ans = Integer.MAX_VALUE;for(i = 0;i<lunch.length;i++){if(lunch[i][0]>=t){System.out.println(lunch[i][1]);return;}int j = binarySearch(dinner,t-lunch[i][0]);ans = Math.min(ans,lunch[i][1]+dinner[j][1]);}System.out.println(ans);}private static int binarySearch(int[][] arr, int target){int low = 0;int high = arr.length-1;while(low<high){int mid = (low+high)/2;int midV = arr[mid][0];if(midV >= target){high = mid;}else {low = mid + 1;}}return low;}

    要點總結

    • 用dp[i] 表示當前美味值的最小熱量 , dp[i][0]表示當前美味值, dp[i][1]表示>=當前美味值的最小熱量, i是美味值有多少種可能。
    • 例如,[[12,10],[10,11]], 經過處理后,成為[12,10],[10,10]]
    • 因此,按照美味值排序后,熱量值也一定是非遞減的
    • 基于熱量值是正序的,可以用二分簡化搜索,找到 t- lunch[i][0]的元素下標表示的熱量值一定最小
  • 翻轉篩子
    每一顆色子都有六面. 給出色子的個數和每一個色子的上下前后左右方位的點數. 色子可以旋轉. 問有多少種色子, 每種多少個(按照降序打印)
  • package Test;import java.util.*;/*** @author cutiewang* @date 2020/8/4 10:49*/ public class ArrayTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[][] nums = new int[n][6];HashMap<String, Integer> map = new HashMap<>();for(int i = 0 ;i<n;i++){//上下 前后 左右int idx = 0;for(int j = 0;j<6;j++){nums[i][j] = sc.nextInt();if(nums[i][j] == 1) idx = j;}//經過這一步,篩子都變成了 1打頭的 狀態,當固定好上下以后,可以暴力檢查左右前后可以轉化//上下固定的序列,前后左右有四種狀態 AiBiAjBj BjAjAiBi AjBjBiAi BiAiBjAjif(idx!=0) convertTo1(nums[i],idx);//比較 前后是否升序, 左右是否升序 如不是,則將其轉化為均升序的序列boolean flag1 = nums[i][2]<nums[i][3];boolean flag2 = nums[i][2]<nums[i][3];//轉化為一種狀態if(!flag1 && !flag2){// 降降swap(nums[i],2,3);swap(nums[i],4,5);}else if(!flag2){//升降swap(nums[i],2,5);swap(nums[i],3,4);swap(nums[i],4,5);}else{//降升swap(nums[i],2,4);swap(nums[i],3,5);swap(nums[i],4,5);}//把轉換好的篩子加入到hashmap中去StringBuilder tmp= new StringBuilder();for(int j:nums[i]){tmp.append(j);}String key = tmp.toString();map.put(key,map.getOrDefault(key,0)+1);}System.out.println(map.size());for(String k:map.keySet()){System.out.print(map.get(k));System.out.print(" ");}}private static void convertTo1(int[] arr,int idx){//說明是1在下,左右無須翻轉,需要翻轉的是前后if(idx == 1){swap(arr,0,1);swap(arr,2,3);}else if(idx % 2==0){//1 在前 1 在左swap(arr,idx,0);swap(arr,idx+1,1);swap(arr,idx,idx+1);}else{//1在后 1在右swap(arr,idx,0);swap(arr,idx-1,1);swap(arr,idx-1,idx);}}private static void swap(int[]arr, int i,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}

    思路是參考牛客大神的

    注釋也在代碼里寫清楚了
    3. 種菜問題
    拼爹爹果然是拼爹爹,明日再寫

    總結

    以上是生活随笔為你收集整理的我胡汉三又回来了之拼多多笔试复盘的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。