每日一些题

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

题解开始之前,给大家安利一个上班偷偷学习的好搭档,idea中的插件有一个叫 LeetCode with labuladong,可以在idea中直接刷力扣的标题。
  


 朋侪们上班没事的时候,可以偷偷摸几题。看八股的话,可以用面试鸭,也是idae插件,比力隐蔽。
子集Ⅱ

标题


思路



  • 排序: 起首对 nums 数组进行排序,排序有助于后续判断重复元素。在递归过程中,我们只会在每个位置选择当前数字,并且如果当前数字和前一个数字相同,我们只会在前一个数字被选择的情况下才选择当前数字。这是避免重复的关键。
  • 回溯算法: 从数组的起始位置开始,每个元素有两种选择:要么选择它,要么不选择它。我们不断递归地进行决定,同时网络所有的子集。
  • 避免重复: 在递归中,处理重复元素时,只有在当前元素与前一个元素相当,并且前一个元素已经被选择的情况下,才可以选择当前元素。这样就避免了重复子集的产生。
题解

  1. public List<List<Integer>> subsetsWithDup(int[] nums) {
  2.         List<List<Integer>> res = new ArrayList<>();
  3.         Arrays.sort(nums);
  4.         fun(nums,0,new ArrayList<Integer>(),res);
  5.         return res;
  6.     }
  7.     private void fun(int[] nums, int start, ArrayList<Integer> cur, List<List<Integer>> res) {
  8.         res.add(new ArrayList<Integer>(cur));
  9.         for (int i = start; i < nums.length; i++) {
  10.             if(i>start&&nums[i]==nums[i-1]){
  11.                 continue;
  12.             }
  13.             cur.add(nums[i]);
  14.             fun(nums,i+1,cur,res);
  15.             cur.remove(cur.size()-1);
  16.         }
  17.     }
复制代码
外貌数列

标题


思路

直接模擬試驗
题解

  1. public String countAndSay(int n) {
  2.         List<Integer> list = new ArrayList<Integer>();
  3.         list.add(1);
  4.         list = fun(1, n, list);
  5.         StringBuilder sb = new StringBuilder();
  6.         for (Integer integer : list) {
  7.             sb.append(integer);
  8.         }
  9.         return sb.toString();
  10.     }
  11.     public List<Integer> fun(int k, int n, List<Integer> list) {
  12.         if (k == n) {
  13.             return list;
  14.         }
  15.         List<Integer> result = new ArrayList<>();
  16.         int forn = 0, num = 0;
  17.         for (Integer integer : list) {
  18.             if (forn == 0) {
  19.                 forn = integer;
  20.                 num = 1;
  21.             } else if (integer == forn) {
  22.                 num++;
  23.             } else {
  24.                 result.add(num);
  25.                 result.add(forn);
  26.                 num = 1;
  27.                 forn = integer;
  28.             }
  29.         }
  30.         result.add(num);
  31.         result.add(forn);
  32.         return fun(k + 1, n, result);
  33.     }
复制代码
两数相除

标题


思路

用位移运算(<<,即左移)可以快速实现“乘法”操作,从而加速除法过程。
具体来说,不断将 divisor 左移(即乘以 2)直到它大于被除数 dividend,然后从高位开始减去符合的倍数。这样可以将复杂度从 O(dividend) 降低到 O(log(dividend))。
代码

  1. public int divide(int dividend, int divisor) {
  2.         if (dividend == Integer.MIN_VALUE && divisor == -1) {
  3.             return Integer.MAX_VALUE;
  4.         }
  5.         if (dividend == Integer.MIN_VALUE && divisor == 1) {
  6.             return Integer.MIN_VALUE;
  7.         }
  8.         int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;
  9.         long absDividend = Math.abs((long) dividend);
  10.         long absDivisor = Math.abs((long) divisor);
  11.         long sum = 0;
  12.         while (absDividend >= absDivisor) {
  13.             long temp = absDivisor, multiple = 1;
  14.             while (absDividend >= (temp << 1)) {
  15.                 temp <<= 1;
  16.                 multiple <<= 1;
  17.             }
  18.             absDividend -= temp;
  19.             sum += multiple;
  20.         }
  21.         sum = sign == 1 ? sum : -sum;
  22.         if (sum > Integer.MAX_VALUE) {
  23.             return Integer.MAX_VALUE;
  24.         }
  25.         if (sum < Integer.MIN_VALUE) {
  26.             return Integer.MIN_VALUE;
  27.         }
  28.         return (int) sum;
  29.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表