Leetcode(Random-2)

Leetcode(Random-2)

leetcode随机写5道题而已 没有别的意思

1093. 大样本统计

// 代码是错的 ,但是不知道哪里出错了  只通过了一半的用例
class Solution {
    public double[] sampleStats(int[] count) {
        // myidea : 
        /**
        最小值:用min记录,遍历count数组,第一次的访问下标所对应的元素不为0的下标就是最小元素
        最大值:用max记录,不断更新即可
        平均值:用sum记录出现的数字的总和以及数字出现的次数num,然后结果就是sum/num
        中位数:记录数字出现的总次数,也就是上述的num。然后判断num是odd or even 然后遍历count找到中位数
        众数:用一个map记录数字出现,以及出现的次数,最后遍历这个map找到众数即可
        */
        // 定义结果数组
        double[] res = new double[5];
        Map<Integer,Integer> map = new HashMap<>();
        int num = 0;
        int sum = 0;
        int min = 257;
        int max = -1;
        double avg = 0.0;
        double mid = 0;
        int zhong = 0;
        //对count数组进行遍历
        for(int i = 0;i<count.length;i++){
            // 如果下标i所对应的元素值不为0
            if(count[i] != 0.0){
                // 更新min和,max
                min = Math.min(i,min);
                max = Math.max(i,max);
                // 更新map
                map.put(i,count[i]);
                // 更新sum
                sum+=i*count[i];
                // 更新num
                num+=count[i];
            }
        }
        System.out.println(num);
        avg = (double)sum / (double)num;
        // 计算中位数
        // 如果有奇数个元素
        if(num%2==1){
            int half = num/2+1;
            for(int key : map.keySet()){
                if(half-map.get(key) <= 0){
                    mid = (double)key;
                    break;
                }
                half-=map.get(key);
            }
        }else{
            //有偶数个元素
            int half = num/2;
            double temp = 0;
            boolean flag = true;
            for(int key:map.keySet()){
                if(half-map.get(key)<=0 && flag){
                    temp+=(double)key;
                    flag = false;
                } 
                if(half+1-map.get(key)<=0){
                    temp+=(double)key;
                    mid = temp/2.0;
                    break;
                }
                half-=map.get(key);
            }
        }
        // 找众数
        int maxEleNum = -1;
        for(int key:map.keySet()){
            if(map.get(key) > maxEleNum){
                zhong = key;
                maxEleNum = map.get(key);
            }
        }
        res[0] = (double)min;
        res[1] = (double)max;
        res[2] = avg;
        res[3] = mid;
        res[4] = zhong;
        for(double ele:res) System.out.print(ele+" ");
        return res;
    }
}

319. 灯泡开关

题目:初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。

class Solution {
    public int bulbSwitch(int n) {
    	// 找到完全平方数的个数就可以了
        if(n==1) return 1;
        int result = 1;
        while(true) {
            if(result*result>n)
                break;
            result++;
        }
        return result-1;
    }
}

984. 不含 AAA 或 BBB 的字符串

class Solution {
    public String strWithout3a3b(int A, int B) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        if(A >= B) index = 2; // index = 2 表示此时要压入 StringBuilder 的是 "a"
        if(A < B) index = 1; // index = 1 则表示需要压入的是 "b"
        while(A > 0 && B > 0) {
            if(index == 2) {
                sb.append("a");A--;
                if(A >= B) {
                    sb.append("a");A--;
                }
                index = 1;
            }
            else {
                sb.append("b");B--;
                if(B >= A) {
                    sb.append("b");B--;
                }
                index = 2;
            }
        }
        /* 处理多余的A或B */
        while(A > 0) {
            sb.append("a");A--;
        }
        while(B > 0) {
            sb.append("b");B--;
        }
        return sb.toString();

    }
}

438. 找到字符串中所有字母异位词

定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // myidea 对字符串s进行遍历,i指针指向s中的元素,i从0到sl-pl,每次判断[i,i+pl]区间中的元素是否与p相等即可
        int sl = s.length();
        int pl = p.length();
        // 结果
        List<Integer> res = new LinkedList<>();
        for(int i = 0;i<sl-pl+1;i++){
            // 用一个数组记录p中的所有的元素以及元素的个数,其中数组下标代表小写字母对应的ascii码值减去a的ascii码值
            int[] record = new int[26];
            for(Character c:p.toCharArray()) record[(int) c- 'a']++;
            // 比较[i,i+pl]区间内的元素是否与p的相同
            for(int j = i;j<i+pl;j++) record[(int)s.charAt(j) - 'a']--;
            // 如果结束比较之后,整个record元素全部都是0的话,说明元素相等
            if(isAllZero(record)) res.add(i);
        }
        return res;
    }
    // 判断一个数组是否全部为0
    public boolean isAllZero(int[] nums){
        for(int num:nums) if(num!=0) return false;
        return true;
    }
}

1268. 搜索推荐系统

给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。
请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。

class Solution {
    public List<List<String>> suggestedProducts(String[] products, String searchWord) {
        List<List<String>> res = new ArrayList<List<String>>();
        for(int i = 0;i<searchWord.length();i++) res.add(new ArrayList<String>());
        // 将products数组按照字典序进行排序
        Arrays.sort(products);
        for(int i = 0;i<searchWord.length();i++){
            // 构建searchWord的子字符串
            String temp = "";
            for(int j = 0;j<=i;j++) temp+=searchWord.charAt(j);
            int tl = temp.length();
            // 循环遍历已经字典序排序的字符串数组
            for(int k = 0;k<products.length;k++){
                // 比较product中的元素的前缀是否与temp相同,若相同则加到结果集中
                if(products[k].length() >= tl && products[k].substring(0,tl).equals(temp)){
                    res.get(i).add(products[k]);
                    // 如果结果集中的数据已经有了3个,就直接跳出循环,不再进行遍历
                    if(res.get(i).size() ==3) break;
                }
            }
        }
        return res;
    }
}
posted @ 2020-11-05 18:39  BOTAK  阅读(95)  评论(0编辑  收藏  举报