Java集训(算法&&面试题)第五天 (容器 & 库)

148 阅读4分钟

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

导读

在这里插入图片描述

在刚刚结束的 每日算法&面试题,大厂特训二十八天冲刺大厂每日算法&面试题,动态规划21天 的训练中我们一起打卡走了过来。但是学习不能停呀,从今天开始我们开始Java集训(算法&&面试题)第一天接着卷起来。

Java集训

给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

示例 1:

输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 01 的数。
[1,2,4,8] 都有 11 。
[3,5,6] 有 21 。
[7] 有 31 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
示例 2:

输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
输出:[1,2,4,8,16,32,64,128,256,512,1024]
解释:数组中所有整数二进制下都只有 11 ,所以你需要按照数值大小将它们排序。
示例 3:

输入:arr = [10000,10000]
输出:[10000,10000]
示例 4:

输入:arr = [2,3,5,7,11,13,17,19]
输出:[2,3,5,17,7,11,13,19]
示例 5:

输入:arr = [10,100,1000,10000]
输出:[10,100,10000,1000]

思路:对每个十进制的数转二进制的时候统计二进制表示中的 11 的个数即可。

class Solution {
    public int[] sortByBits(int[] arr) {
        int[] bit = new int[10001];
        List<Integer> list = new ArrayList<Integer>();
        for (int x : arr) {
            list.add(x);
            bit[x] = get(x);
        }
        Collections.sort(list, new Comparator<Integer>() {
            public int compare(Integer x, Integer y) {
                if (bit[x] != bit[y]) {
                    return bit[x] - bit[y];
                } else {
                    return x - y;
                }
            }
        });
        for (int i = 0; i < arr.length; ++i) {
            arr[i] = list.get(i);
        }
        return arr;
    }

    public int get(int x) {
        int res = 0;
        while (x != 0) {
            res += x % 2;
            x /= 2;
        }
        return res;
    }
}


给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false

思路:tt 是 ss 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 2626 个小写字母,因此我们可以维护一个长度为 2626 的频次数组 \textit{table}table,先遍历记录字符串 ss 中字符出现的频次,然后遍历字符串 tt,减去 \textit{table}table 中对应的频次,如果出现 \textit{table}[i]<0table[i]<0,则说明 tt 包含一个不在 ss 中的额外字符,返回 \text{false}false 即可。


class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}


面试题

什么是微服务架构?
微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微
服务运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过
自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限
度的集中式管理


微服务有哪些特点?
 解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和
扩展
 组件化 – 微服务被视为可以轻松更换和升级的独立组件
 业务能力 – 微服务非常简单,专注于单一功能
 自治 – 开发人员和团队可以彼此独立工作,从而提高速度
 持续交付 – 通过软件创建,测试和批准的系统自动化,允许频繁发布软件
 责任 – 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品
 分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技
术模式。开发人员可以自由选择最有用的工具来解决他们的问题
 敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃