算法小知识-------02·13-------周末 * 2

123 阅读2分钟

这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

周末,重拳出击两道题,维持一下题感

"气球"的最大数量

该题出自力扣的1189 —— "气球"的最大数量

审题

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。
字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。

  • 题目很简单,就是给出一个字符串,找出可以拼凑出"ballon"单词的字符数量,而且不能够重复使用。
  • 方法很多,可以用额外的空间去统计数量,例如HashMap等,统计数量后根据最少值得出数量
  • 或者利用数组存放,并且统计最少出现的值即可

编码

class Solution {
    public int maxNumberOfBalloons(String text) {
        int[] cnt = new int[5];
        for (int i = 0; i < text.length(); ++i) {
            char ch = text.charAt(i);
            if (ch == 'b') {
                cnt[0]++;
            } else if (ch == 'a') {
                cnt[1]++;
            } else if (ch == 'l') {
                cnt[2]++;
            } else if (ch == 'o') {
                cnt[3]++;
            } else if (ch == 'n') {
                cnt[4]++;
            }
        }
        cnt[2] /= 2;
        cnt[3] /= 2;
        return Arrays.stream(cnt).min().getAsInt();
    }
}

image.png

数组中重复的数字

该题出自力扣的剑指offer03 —— 数组的重复的数组

审题

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数 字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

  • 题目就是找到重复的数字,而且没有限制,随便一个都可以。
  • 一开始考虑到摩尔投票的方法,但是后来否决了,感觉把问题严重化了
  • 还是循环就可以了,不过在此之前先排序,不过这样时间复杂就变成了nLogn了
  • 其实也可以用额外的空间,用set,直接确定是否重复

编码

class Solution {
    public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        int p = 0;
        while(p<nums.length){
            if(nums[p] == nums[p+1])return nums[p];
            p++;
        }
        return p;
    }
}

image.png