9.9携程后台笔试AK代码

三个编程题
1. linux命令
2. 一组数划分为k个区间
3. 01字符串 消去1
public class test10 { //第一题     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = Integer.parseInt(sc.nextLine());         String[] ops = new String[n];         for(int i=0; i < n; i++){             ops[i] = sc.nextLine();         }         StringBuilder sb = new StringBuilder();         for(int i=0; i < n; i++){             if(ops[i].startsWith("cd")){                 String s = ops[i].substring(3);                 if(s.equals("..")){                     int le = sb.length();                     while(le > 0 && sb.charAt(le-1) != '\\'){                         sb.deleteCharAt(le-1);                         le--;                     }                     if(le >= 1) sb.deleteCharAt(le-1);                 }                 else sb.append('\\').append(s);             }             else{                 if(sb.length() == 0) System.out.println('\\');                 else System.out.println(sb.toString());             }         }     } //***第二题     public static void main2(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         int k = sc.nextInt();         int[] nums = new int[n];         for(int i=0; i < n; i++) nums[i] = sc.nextInt();         int max = nums[0], min = nums[0];         for(int num : nums){             max = Math.max(max, num);             min = Math.min(min, num);         }         int l = 0, r = max - min, m = 0;         while(l < r){             m = (l + r) / 2;             if(check(nums, k, m)) r = m;             else l = m + 1;         }         System.out.println(l);     }     private static boolean check(int[] nums, int k, int x){         int max = nums[0], min = nums[0];         for(int i=1; i < nums.length; i++){             max = Math.max(max, nums[i]);             min = Math.min(min, nums[i]);             if(max - min > x){                 k--;                 if(k <= 0) return false;                 max = min = nums[i];             }         }         return k > 0;     } //***第三题     public static void main3(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         int m = sc.nextInt();         String str = sc.next();         int[][] score = new int[m][2];         for(int i=0; i < m; i++){             score[i][0] = sc.nextInt();             score[i][1] = sc.nextInt();         }         //这里用Map不行,因为Map无序         Arrays.sort(score, (a, b)->{             return a[0] - b[0];         });         List<Integer> list = new ArrayList<>();         int cnt = 0, max = 0;         for(char ch : str.toCharArray()){             if(ch == '1') cnt++;             else{                 max = Math.max(max, cnt);                 if(cnt != 0) list.add(cnt);                 cnt = 0;             }         }         max = Math.max(max, cnt);         if(cnt != 0) list.add(cnt);         int[] dp = new int[max+1];         for(int i=1; i <= max; i++){             for(int j=0; j < m && score[j][0] <= i; j++){                 int x = score[j][0], y = score[j][1];                 for(int t=1; t * x <= i; t++){                     dp[i] = Math.max(dp[i], dp[i - t * x] + t * y);                 }             }         }         int ans = 0;         for(int num : list){             ans += dp[num];         }         System.out.println(ans);     } }

#笔经#
全部评论
个人注解: /*主函数*/{ // 首先找出整个数组中的两个最值         for(int num : nums){             max = Math.max(max, num);             min = Math.min(min, num);        } // 这里是采用了二分的思路,因为段的不平衡度是非严格递增的(重点),也就是有序的,故可以使用二分法 // left为0,即平衡度的最小值;right为max-min,即段为整个数组时的平衡度,此时拆分后的段的平衡度不可能超过这个值         int l = 0, r = max - min, m = 0;         while(l < r){             m = (l + r) / 2; // 检查平衡度小于等于m的段是否存在,若存在,我们缩小右边界,看看是否存在更小的平衡度             if(check(nums, k, m)) r = m; // 若不存在,说明需要往大于m的方向寻找             else l = m + 1; } // 因为left是从0开始的,而且每次只递增1,那么最后跳出时就是我们所求的结果         System.out.println(l); } // 是否存在满足平衡度<=x的最长的段  boolean check(int[] nums, int k, int x){       int max = nums[0], min = nums[0];       for(int i=1; i < nums.length; i++){           max = Math.max(max, nums[i]);           min = Math.min(min, nums[i]); // 当平衡度大于x时,开启下一个段,看是否存在更小的平衡度。直到达到段数的限制,则返回false           if(max - min > x){               k--;               if(k <= 0) return false;               max = min = nums[i];      }   }         return k > 0; }
5 回复 分享
发布于 2021-09-10 09:34
有朋友分享一下笔试题吗
点赞 回复 分享
发布于 2021-09-11 10:18
大佬!!!!!!!
点赞 回复 分享
发布于 2021-09-09 23:40
tql
点赞 回复 分享
发布于 2021-09-09 21:40
int n = Integer.parseInt(sc.nextLine()); 大佬请教一下,这里为什么不能直接使用int n = sc.nextInt()呢?
点赞 回复 分享
发布于 2021-09-09 21:23
第二题解法长见识了
点赞 回复 分享
发布于 2021-09-09 21:04

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
评论
8
19
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
4344次浏览 34人参与
# 你的实习产出是真实的还是包装的? #
1041次浏览 27人参与
# 米连集团26产品管培生项目 #
3754次浏览 163人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6842次浏览 35人参与
# 简历第一个项目做什么 #
31227次浏览 312人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186301次浏览 1113人参与
# MiniMax求职进展汇总 #
22753次浏览 292人参与
# 面试紧张时你会有什么表现? #
30312次浏览 188人参与
# 简历中的项目经历要怎么写? #
309297次浏览 4146人参与
# 网易游戏笔试 #
6300次浏览 83人参与
# 职能管理面试记录 #
10674次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6809次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56693次浏览 357人参与
# 腾讯音乐求职进展汇总 #
160376次浏览 1105人参与
# 小红书求职进展汇总 #
226831次浏览 1356人参与
# AI时代,哪些岗位最容易被淘汰 #
62254次浏览 723人参与
# 你怎么看待AI面试 #
179196次浏览 1160人参与
# 正在春招的你,也参与了去年秋招吗? #
362437次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92119次浏览 896人参与
# 机械求职避坑tips #
94392次浏览 567人参与
# 校招笔试 #
465713次浏览 2948人参与
# 面试官最爱问的 AI 问题是...... #
27023次浏览 833人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务