leetCode - - - 哈希表

news2024/9/22 16:36:52

目录

1.模拟行走机器人(LeetCode 874)

2.数组的度(LeetCode 697)

3.子域名访问次数(LeetCode 811)

4.字母异位词分组(LeetCode 49)

5.小结

1.常见的哈希表实现

2.遍历Map


1.模拟行走机器人(LeetCode 874)

机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands :

  • -2 :向左转 90 度
  • -1 :向右转 90 度
  • 1 <= x <= 9 :向前移动 x 个单位长度

在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点  obstacles[i] = (xi, yi) 。

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,并继续执行下一个命令。

返回机器人距离原点的 最大欧式距离 的 平方 。(即,如果距离为 5 ,则返回 25 )

注意:

  • 北方表示 +Y 方向。
  • 东方表示 +X 方向。
  • 南方表示 -Y 方向。
  • 西方表示 -X 方向。
  • 原点 [0,0] 可能会有障碍物。

示例 1:

输入:commands = [4,-1,3], obstacles = []
输出:25
解释:
机器人开始位于 (0, 0):
1. 向北移动 4 个单位,到达 (0, 4)
2. 右转
3. 向东移动 3 个单位,到达 (3, 4)
距离原点最远的是 (3, 4) ,距离为 32 + 42 = 25

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {

        // 初始化结果
        int result = 0;
        
        // 从原点( 0 ,0 )位置开始出发
        int x = 0, y = 0;
        
        // 机器人前进的方向
        // 初始方向:正北
        int direction = 0;

        // 定义四个方向
        int[][] direxy = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

        // 障碍物有多个,所以需要有一个障碍物坐标点集合
        // 使用 集合 Set 存储障碍物的坐标,用来检查下一步是否受阻
        // 机器人每试图走一个位置,就用此位置与障碍物集合列表里的坐标进行比较,看是否刚好是障碍物坐标点
        HashSet<String> obstaclesSet = new HashSet<String>();

        // 存储障碍物坐标点
        for (int[] obs : obstacles) {

            // 以坐标的形式存储
            obstaclesSet.add(obs[0] + "," + obs[1]);

        }

        // 机器人开始行走
        for (int com : commands) {

            // -2:向左转 90 度
            if (com == -2) {
                direction = (direction == 0) ? 3 : direction - 1;

            // -1:向右转 90 度
            } else if (com == -1) {
                direction = (direction == 3) ? 0 : direction + 1;
            
            // 1 <= x <= 9 :向前移动 x 个单位长度
            } else {
                // 没有遇到障碍物,一直往前走 com 个单位长度
                while (com-- > 0 && !obstaclesSet.contains((x + direxy[direction][0]) + "," + (y + direxy[direction][1]))) {
                    x += direxy[direction][0];
                    y += direxy[direction][1];
                }

                // 机器人停下来后开始计算最大欧式距离的平方
                // 更新结果
                result = Math.max(result, x * x + y * y);
            }
        }
        return result;
    }
}

知识点:

1. 二维数组的使用
定义:int[] obs 表示一个一维数组,每个 obs 是 obstacles 数组的元素。obstacles 是一个二维数组,其中的每个元素都是表示障碍物坐标的数组。
访问元素:通过 obs[0] 和 obs[1] 可以访问障碍物的 x 和 y 坐标。
2. 集合(HashSet)的使用
定义:HashSet 是一个集合类,它不允许重复的元素,并且提供了高效的查找、添加和删除操作。
用法:在这里,obstaclesSet 被用来存储障碍物的坐标,以便快速查找。这种存储方式提高了查找效率,尤其是在处理大量障碍物数据时。
3. 字符串的连接
操作:obs[0] + "," + obs[1] 将 x 和 y 坐标值转换为字符串格式 "x,y"。这种格式使得坐标可以被轻松地存储和比较。
应用:将坐标以字符串形式存储到 HashSet 中,便于进行后续的查找和操作。
4. 增强的 for 循环
定义:for (int[] obs : obstacles) 是 Java 的增强型 for 循环(或称为 foreach 循环),它用于遍历数组或集合中的每一个元素。
用法:这使得遍历 obstacles 数组中的每个障碍物坐标变得简单和直观。
5. 坐标系统
概念:x 和 y 坐标用于表示二维空间中的位置。在代码中,obs[0] 和 obs[1] 分别代表 x 和 y 坐标值。


2.数组的度(LeetCode 697)

给定一个非空且只包含非负数的整数数组 nums,数组的  的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

示例 1:

输入:nums = [1,2,2,3,1]
输出:2
解释:
输入数组的度是 2 ,因为元素 1 和 2 的出现频数最大,均为 2 。
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组 [2, 2] 的长度为 2 ,所以返回 2 。

示例 2:

输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:
数组的度是 3 ,因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。

解题思路

1.哈希表:使用 HashMap 存储每个元素的出现次数及其最早和最后出现的位置。
2.数组遍历:通过遍历数组来填充哈希表的信息。
3.度量最大出现次数:在哈希表中查找出现次数最多的元素。(第一次遍历)
4.计算最短子数组长度:遍历哈希表,找到包含出现次数最多元素的最短子数组。(第二次遍历)

知识点运用

Map.Entry 是 Map 接口中的一个嵌套接口,表示 Map 中的一个键值对。
1.主要方法:
getKey():获取 Map.Entry 的键。
getValue():获取 Map.Entry 的值。
setValue(V value):设置 Map.Entry 的值。
2.遍历 Map:最常用的方式是通过 entrySet() 方法,该方法返回 Map 中所有键值对的集合(Set<Map.Entry<K, V>>)。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 2);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + ": " + value);
}

解题代码: 

class Solution {
    public int findShortestSubArray(int[] nums) {
    // 初始化长度为一个大数值,方便后续更新
        int minLength = Integer.MAX_VALUE;

        // Map存储每个元素的出现次数及其最早和最晚出现位置
        Map<Integer, int[]> map = new HashMap<>();

        // 遍历数组,统计每个元素的信息
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) {
                int[] value = map.get(nums[i]);
                value[0]++; // 增加出现次数
                value[2] = i; // 更新最后出现的位置
            } else {
                // 第一次出现该元素
                map.put(nums[i], new int[]{1, i, i});
            }
        }

        // 计算数组中出现次数最多的元素
        int maxTimes = 0;
        for (int[] value : map.values()) {
            maxTimes = Math.max(maxTimes, value[0]);
        }

        // 再次遍历map来找到最短长度
        for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
            int[] value = entry.getValue();
            if (value[0] == maxTimes) {
                minLength = Math.min(minLength, value[2] - value[1] + 1);
            }
        }

        return minLength;
    }
}

3.子域名访问次数(LeetCode 811)

网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ,二级域名为 "leetcode.com" ,最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com" 时,同时也会隐式访问其父域名 "leetcode.com" 以及 "com" 。

计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示,其中 rep 表示访问域名的次数,d1.d2.d3 为域名本身。

  • 例如,"9001 discuss.leetcode.com" 就是一个 计数配对域名 ,表示 discuss.leetcode.com 被访问了 9001 次。

给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

示例 1:

输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com" 和 "com" 都会被访问,所以它们都被访问了 9001 次。

示例 2:

输入:cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
输出:["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
解释:按照前文描述,会访问 "google.mail.com" 900 次,"yahoo.com" 50 次,"intel.mail.com" 1 次,"wiki.org" 5 次。
而对于父域名,会访问 "mail.com" 900 + 1 = 901 次,"com" 900 + 50 + 1 = 951 次,和 "org" 5 次。

class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {

        // 使用哈希表记录每个子域名的计数
        Map<String, Integer> map = new HashMap<>();

        // 遍历数组
        for (String s : cpdomains) {

            // 获取当前字符串的长度
            int n = s.length();
            
            // 每个字符串都是由数字 + 域名组成
            // 先去获取这个字符串中的数字
            // 从 0 开始,向后扫描到空格位置
            int idx = 0;

            // 从前向后扫描到空格位置
            while (idx < n && s.charAt(idx) != ' ') idx++;

            // 截取出数字来
            // tips: substring() 方法返回字符串的子字符串
            // beginIndex -- 起始索引(包括), 索引从 0 开始
            // endIndex -- 结束索引(不包括)
            int cnt = Integer.parseInt(s.substring(0, idx));

            // 从后往前处理域名部分,直到处理完毕
            int start = idx + 1; 
            
            // 从后往前处理域名部分
            idx = n - 1;

            // 直到处理完毕
            while (idx >= start) {

                // 每个域名由多个子域名组成
                // 通过 . 来截取
                while (idx >= start && s.charAt(idx) != '.') idx--;

                // 获取当前子域名
                String cur = s.substring(idx + 1);

                // 更新这个子域名的计数
                map.put(cur, map.getOrDefault(cur, 0) + cnt);

                // idx 继续向前移动
                idx--;
            }
        }

        // 从哈希表中构造出数组答案来
        List<String> ans = new ArrayList<>();

        // keySet() 方法返回映射中所有 key 组成的 Set 视图
        for (String key : map.keySet()) {

            // key 是域名,map.get(key) 获取 value
            ans.add(map.get(key) + " " + key);

        }

        // 返回结果
        return ans;
    }
}

区别keySet() 和 entrySet()
keySet():
返回 Map 中所有键的集合 (Set<K>).
适合只需要处理键的情况。例如,只需要检查键是否存在或者只需要获取键的列表。
entrySet():
返回 Map 中所有键值对的集合 (Set<Map.Entry<K, V>>).
更适合同时需要访问键和值的情况。通过 Map.Entry<K, V> 对象可以直接访问键和值,提高效率

for (String key : map.keySet()) {
    System.out.println(key + " -> " + map.get(key));
}


for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

4.字母异位词分组(LeetCode 49)

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

做题思路:

1.遍历所有字符串,计算每个字符串的字符频次。
2.将频次转换为唯一的键,并使用哈希表将具有相同键的字符串分组。
3.返回哈希表中所有分组的值,即字母异位词的分组结果

较为严谨的解法:不确定每个字符串是否可以有重复的字符,这里计算了每个字符出现的频次

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map=new HashMap<String,List<String>>();
        for(String str:strs){
            // count 代表每个小写字母出现的频次
            int[] count=new int[26];

            // 利用 for 循环,统计 str 当中每个字母出现的频次
            for(int i=0;i<str.length();i++){
                count[str.charAt(i) -'a']++;
            }
            StringBuffer sb=new StringBuffer();

            // // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
            for(int i=0;i<26;i++){
                if(count[i]!=0){
                    // 先记录字母,比如记录了字母 k
                    sb.append((char)(i+'a'));
                     // 再记录次数,比如记录了次数 9
                    sb.append(count[i]);
                }
            }
            // 转换为字符串的形式,比如为 a1c9q7
            String key=sb.toString();
            // 在哈希表 map 当中找出这个 key 对应的字符串 str 来
            // 1、如果有这个 key,那么这个 key 对应的 数组 会新增一个 str 进去
            // 2、如果没有这个 key,那么会初始化一个数组,用来新增这个 str
            List<String> list=map.getOrDefault(key,new ArrayList<String>());
            list.add(str);
            map.put(key,list);
        }

        //return new ArrayList<>(map.values());
        return  new ArrayList<List<String>>(map.values()); 
    }
}

力扣给的通过率最高的解法:默认每个字符串中不会出现重复的字母

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
         HashMap<String, List<String>> hashMap = new HashMap<>();
        for (String str : strs) {
            char[] charArray = str.toCharArray();
            Arrays.sort(charArray);
            String key = new String(charArray);
            List<String> list = hashMap.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            hashMap.put(key, list);
        }
        return  new ArrayList<>(hashMap.values());
    }
}

5.小结

1.常见的哈希表实现

HashMap:

用于存储键值对,每个键(key)与一个值(value)相关联。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
int value = map.get("apple");


使用:使用 HashMap 统计元素出现的次数

Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
    map.put(num, countMap.getOrDefault(num, 0) + 1);
}


HashSet:

适用于需要存储唯一元素的场景(类似于 HashMap 的键部分)

Set<String> set = new HashSet<>();
set.add("apple");
boolean exists = set.contains("apple"); // true


使用:通过 HashSet 快速查找元素是否出现过

Set<Integer> set = new HashSet<>();
for (int num : nums) {
    if (!set.add(num)) {
        // 如果返回 false,说明 num 已经存在
    }

2.遍历Map


entrySet() 是最常用的方法,适合遍历 Map 中的键值对。
keySet() 和 values() 方法适合只需要键或值时使用。

 // 遍历 entrySet()
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("Key: " + key + ", Value: " + value);
        }

// 遍历 keySet()
for (String key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key: " + key + ", Value: " + value);
}

// 遍历 values()
for (Integer value : map.values()) {
    System.out.println("Value: " + value);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java中的SSM框架实现医院收费系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现医院收费系统演示 摘要 随着医疗体制改革的不断深入&#xff0c;医院收费系统成为医院信息化建设的重点内容。医院收费系统是利用计算机、网络技术和数据库技术&#xff0c;实现病人在医疗机构的诊疗信息的电子化存储、传递和分析&#xff0c;从而提高…

[Meachines] [Medium] Mango PHP弱比较绕过+MongoDB注入+TRP00F自动化权限提升+JJS权限提升

信息收集 IP AddressOpening Ports10.10.10.162TCP:22&#xff0c;80&#xff0c;443 $ nmap -p- 10.10.10.162 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-host…

<数据集>快递识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5382张 标注数量(xml文件个数)&#xff1a;5382 标注数量(txt文件个数)&#xff1a;5382 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Box-Packet] 序号类别名称图片数框数1Box-Packet53828965 使用标注工…

8.15-配置mysql5.7环境+使用python管理数据库+使用中间件mycat配置读写分离

一、配置mysql5.7的环境 1.基础配置 # 将mysql5.7的包拖入xshell [rootmysql_5 ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz ​ # 解压 [rootmysql_5 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz ​ # 备份文件 [rootmysql_5 ~]# cp…

短说V4.2.0测试版发布|字体更换、小名片及个人中心UI更换

Hi 大家好&#xff0c; 我是给你们带来惊喜的运营小番茄。 本期更新为短说V4.2.0测试版&#xff0c;本次更新涉及平台有H5、App、微信小程序。 4.2.0版本除功能优化外&#xff0c;新增了如下功能&#xff1a; 一、新增功能 通用版&#xff1a; ①全站默认字体全部更换为…

淘宝到一个墨水屏,成功实现显示经历记录

一&#xff0c;淘一个墨水屏的原因 在一些小的PCB设计和编程中发现&#xff0c;许多程序控制运行情况如果能够显示出来&#xff0c;会很完美。大学时期使用LCD1602&#xff08;经典&#xff09;显示了一个称重传感器的课程设计&#xff0c;后来尝试OLED显示。在过程中发现墨水…

【嵌入式linux开发】智能家居入门5(QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派)

智能家居入门5&#xff08;QT、微信小程序、HTTP协议、ONENET云平台、旭日x3派&#xff09; 前言一、QT界面设计二、云平台产品创建与连接三、下位机端QT代码总览&#xff1a;四、微信小程序端代码总览五、板端测试 前言 前四篇智能家居相关文章都是使用STM32作为主控&#xf…

报表的多行业应用!用工具做报表省了我不少事...

一、什么是报表&#xff1f; 说起报表&#xff0c;你不会还停留在Excel报表的层面上吧&#xff1f; 传统的报表一般都是基于Excel制作的&#xff0c;主要面向业务人员、开发人员等&#xff0c;也有一些公司会自己去开发设计&#xff0c;只不过周期较长&#xff0c;耗费人力多。…

端到端自动驾驶落地挑战与驱动力

1、端到端的发展驱动力 1.1 对标驱动&#xff1a;特斯拉FSD的标杆作用吸引行业关注 大部分行业专家表示&#xff0c;特斯拉FSD v12的优秀表现&#xff0c;是端到端自动驾驶这一技术路线快速形成大范围共识的最重要的推动力&#xff1b;而在此之前&#xff0c;从来没有一个自动…

C#模拟量线性变换小程序

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。本文详细介绍了如何使用C#构建一个项目,通过S7net库连接并连续读取S7-1200 PLC的数据,包括创建窗体应用、配置存储位置、安装S7net库…

服务器端请求伪造漏洞

1.客户端请求 客户端请求指的是由客户端设备(如个人计算机、智能手机、平板电脑等)或软件(浏览器、各种APP)发出的请求&#xff0c;以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输入URL或点击链接时&#xff0c;浏览器会自动发起HTTP请求&#xff0c;请求服…

Python | Leetcode Python题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; class Solution:def isSelfCrossing(self, distance: List[int]) -> bool:n len(distance)# 处理第 1 种情况i 0while i < n and (i < 2 or distance[i] > distance[i - 2]):i 1if i n:return False# 处理第 j 次移动的情况…

【语义通信】灵(Genie)——6G的第四维元素

6G 不仅包含 5G 涉及的人类社会、信息空间、 物理世界&#xff08;人、机、物&#xff09;这 3 个核心元素&#xff0c;还第四维元素—灵&#xff08;Genie&#xff09;。Genie存在于虚拟世界体系&#xff0c;虚拟世界体系包括&#xff08;VPS, VBS, VSS&#xff09;&#xff0…

BvSP_ Broad-view Soft Prompting for Few-Shot Aspect Sentiment Quad Prediction

中文题目: 英文题目: BvSP: Broad-view Soft Prompting for Few-Shot Aspect Sentiment Quad Prediction 论文地址: aclanthology.org/2024.acl-long.460.pdf 代码地址: https://github.com/byinhao/BvSP 论文级别&#xff0c; 单位: (2024 ACL long paper) 南开大学&#xff0…

写给大数据开发:如何解决拖延

你是否曾面对一个复杂的Spark任务&#xff0c;明知它对项目至关重要&#xff0c;却总是找各种理由推迟动手&#xff1f;或者&#xff0c;你有没有在面对一堆待优化的Hive查询时&#xff0c;选择先去重构那个"并不那么紧急"的Python脚本&#xff1f; 如果你点头了&am…

faceswap安装

目录 简介下载地址安装clone代码安装conda配置和安装 启动其他 简介 Faceswap 是领先的免费开源多平台 Deepfakes 软件。由 Tensorflow、Keras 和 Python 提供支持&#xff1b;Faceswap 将在 Windows、macOS 和 Linux 上运行。支持CPU运行&#xff0c;无独显也能跑。 下载地址…

language model

1、language model&#xff08;LM&#xff09;&#xff1a;估计token序列的可能性 2、对于HMM&#xff0c;固定需要P(Y)才符合公式&#xff1b;对于LAS&#xff0c;加上P(Y)能够使效果更好 P(Y|X)需要成对的数据&#xff0c;而P(Y)不需要成对&#xff0c;所以可以得到很多数据 …

Git使用教程介绍 - 1.Git 起因和背景

对于git的整体运作体系和更多的基本操作和概念并不是非常熟悉&#xff0c;因此恶补一番&#xff0c;把自己的成果和理解整理为一个git使用系列。 我也会不断更新该系列&#xff0c;与大家共勉&#xff0c;也是自我学习迭代的过程。 更多技术文章&#xff0c;全网首发公众号 “…

pytorch库 05 PyTorch深度学习实践笔记

文章目录 一、基本概念1、深度学习流程2、感知机结构与人工神经网络结构3、反向传播&#xff08;Back Propagation&#xff09;导学 二、线性模型1、线性模型计算流程2、代码实现3、小练习 三、梯度下降算法1、梯度下降计算流程2、代码实现3、随机梯度下降&#xff08;SGD&…

你还纠结996吗?2024年互联网公司工作时长排行榜出炉!

2024年互联网公司工作时长排行榜新鲜出炉&#xff01;在这个竞争激烈的行业中&#xff0c;工作时长一直是人们关注的热点话题。你还在纠结996工作制吗&#xff1f;也许这份排行榜会给你一些意想不到的答案。 为什么一些公司依旧推行996&#xff0c;而另一些公司却在努力减少员…