11.30-12.6

11月30日

767.重构字符串

class Solution {
    public String reorganizeString(String S) {
        char[] s = S.toCharArray();
        int[] count = new int[26];
        int l = S.length();

        //统计每个字符出现的次数
        for (int i = 0; i < l; i++) {
            count[s[i] - 'a']++;
        }
        int max = 0, alphabet = 0;
        //找出出现次数最多的那个字符
        for (int i = 0; i < count.length; i++) {
            if (count[i] > max) {
                max = count[i];
                alphabet = i; 
            }
        }
        //如果出现次数最多的那个字符的数量大于阈值,说明他不能使得两相邻的字符不同
        if (max > ((l + 1) / 2)){
             return "";
        } 
        //res就是返回结果
        char[] res = new char[l];
        int index = 0;
        //先把出现次数最多的字符存储在数组下标为偶数的位置上
        while (count[alphabet]-- > 0) {
            res[index] = (char) (alphabet + 'a');
            index += 2;
        }
        //然后再把剩下的字符存储在其他位置上
        for (int i = 0; i < count.length; i++) {
            while (count[i]-- > 0) {
                if (index >= res.length) {
                    index = 1;
                }
                res[index] = (char) (i + 'a');
                index += 2;
            }
        }
        return new String(res);
    }
}

12月1日

34.在排序数组中查找元素的第一个和最后一个位置

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ans = new int[2];
        int start = -1, end = -1;
        //从左往右遍历,找到第一个相同的
        for(int i = 0; i < nums.length; i ++) {
            if(nums[i] == target) {
                start = i;
                break;
            }
        }
        //从右往左遍历,找到第一个相同的
        for(int i = nums.length - 1; i >= 0; i --) {
            if(nums[i] == target) {
                end = i;
                break;
            }
        }
        ans[0] = start;
        ans[1] = end;
        return ans;
    }
}
class Solution {
    public int[] searchRange(int[] nums, int target) {
        //寻找 left 即为在数组中寻找第一个大于等于 targett 的下标,寻找 right 即为在数组中寻找第一个大于 target 的下标,然后将下标减一
        int left = binarySearch(nums, target, true);
        int right = binarySearch(nums, target, false) - 1;
        if(left <= right && right < nums.length && nums[left] == target && nums[right] == target) {
            return new int[]{left, right};
        } 
        return new int[]{-1, -1};
    }

    public int binarySearch(int[] nums, int target, boolean lower) {
        int left = 0, right = nums.length - 1, ans = nums.length;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] > target || (lower && nums[mid] >= target)) {
                right = mid - 1;
                ans = mid;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
}

12月2日

321.拼接最大数

class Solution {
    public int[] maxNumber(int[] nums1, int[] nums2, int k) {
        int m = nums1.length, n = nums2.length;
        int[] res = new int[k];
        //先从nums2中取k个数,若不够,则取n个数,从nums1中取k-n个数,然后依次增减
        for(int i = Math.max(0, k - n); i <= k && i <= m; i ++) {
            //将两个数组组合起来,使其数值最大
            int[] arr = merge(maxArr(nums1, i), maxArr(nums2, k - i), k);
            //比较每种组合的大小,取大的
            if (gt(arr, 0, res, 0)) {
                res = arr;
            }
        }
        return res;
    }

    //从给定数组中按顺序取得k个最大的数,返回值为取得的数组成的数组
    private int[] maxArr(int[] nums, int k) {
        int n = nums.length;
        int[] res = new int[k];
        //i为当前取得了几个数,j为存储最大数的数字的下标
        for(int i = 0, j = 0; i < n; i ++) {
            //n-i为nums中还剩几个数没有判断,n-i+j为当前最多有几个数,如果下一个数比已选取的数大的话,则将其替换
            while (n - i + j > k && j > 0 && nums[i] > res[j-1]){
                j --;
            }  
            if (j < k){
                res[j ++] = nums[i];
            }
        }
        return res;
    }
    //拼接两个数组,得到结果最大的数组
    private int[] merge(int[] nums1, int[] nums2, int k) {
        int[] res = new int[k];
        for(int i = 0, j = 0, r = 0; r < k; r ++) {
            //判断两个数组当前位置的数的大小,取大的,已取得的数组下标+1
            res[r] = gt(nums1, i, nums2, j) ? nums1[i++] : nums2[j++];
        }
        return res;
    }

    //比较两数组相应位置大小,相等就一直跳过,直到不相等就比较
    private boolean gt(int[] nums1, int i, int[] nums2, int j) {
        while(i < nums1.length && j < nums2.length && nums1[i] == nums2[j]) {
            i++;
            j++;
        }
        //如果两数组前面的数一样,则先从nums1中取
        return j == nums2.length || (i < nums1.length && nums1[i] > nums2[j]);
    }
}

12月3日

204.计数质数

//暴力法,遍历每一个数,判断它是否是质数
class Solution {
    public int countPrimes(int n) {
        if(n < 2) {
            return 0;
        }
        int num = 0;
        for(int i = 2; i < n; i ++) {
            boolean t = true;
            for(int j = 2; j*j <= i && t; j ++) {
                if(i % j == 0) {
                    t = false;
                }
            }
            if(t) {
                num ++;
            }
        }
        return num;
    }
}
class Solution {
    public int countPrimes(int n) {
        if(n < 2) {
            return 0;
        }
        int num = 0;
        int[] a = new int[n+1];
        for(int i = 2; i < n; i ++){
            a[i] = 1;
        }
        //从2开始遍历,把每个数的在n以内的倍数除去
        for(int i = 2; i < n; i ++) {
            if(a[i] != 0) {
                num ++;
                for(int j = i*2; j < n; j += i) {
                    a[j] = 0;
                }
            }
        }
        return num;
    }
}

12月5日

621.任务调度器

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] map = new int[26];
        //统计每个任务出现的次数,并排序
        for(int i = 0; i < tasks.length; i ++) {
            map[tasks[i] - 'A'] ++;
        }
        int ans = 0;
        Arrays.sort(map);
        /*
        分配任务,每n+1个任务为一组,每组任务各不相同,每次分完任务重新排序
        所以当map[25] == 0时,所有任务都分配完了
        优先分配次数最多的,如果没有其它任务用来间隔冷却时间,那么就添加待命状态
        */
        while(map[25] > 0) {
            int i = 0;
            while(map[25] > 0 && i <= n) {
                if(i < 26 && map[25-i] > 0) {
                    map[25-i] --;
                }
                i ++;
                ans ++;
            }
            Arrays.sort(map);
        }
        return ans;
    }
}

12月6日

118.杨辉三角

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();
        int[][] res = new int[numRows][numRows];
        int n = 1;
        for(int i = 0; i < numRows; i ++) {
            List<Integer> l = new ArrayList<>();
            for(int j = 0; j < n; j ++) {
                if(j == 0 || j == n-1) {
                    res[i][j] = 1;
                } else {
                    res[i][j] = res[i-1][j-1] + res[i-1][j];
                }
                l.add(res[i][j]);
            }
            n ++;
            list.add(l);
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值