恒生电子笔试交流 20240926

9.26 晚的恒生电子笔试,被数据库实操干懵了。

这里记录一下自己的算法题题解和数据库实操的 SQL 语句,SQL 语句是事后在 AI 帮助下写出来的,案例运行结果对了,不知道是否完全正确,希望大家指正。若帖子侵权,可联系删除。

算法题 1(AC):直接输出即可,注意要用 long,因为题目说数字可以到达 10^9,2 个 10^9 相乘会超过 int 的范围

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long c = scanner.nextLong();
        System.out.println((c / 2) * (c - c / 2));
    }
}

算法题 2(AC):根据题意,S 表示一个连续子数组中所有相邻元素的最大公因数之和,既然是连续子数组,肯定想到滑动窗口,看大家和我一样很多,首次提交时只过 90%,下面 2 个示例可以说明原因(吐槽一下,题目真挺拗口的,难点在于看懂题目而不是写出来,求两数的最大公因数用辗转相除法这一点需要一点数学基础)

输入:3 5
     6 3 7
输出:0
说明:k = 5,比第 2 个元素 3 大,存在子数组 6 [3] 7,但是区间大小为 1,根据定义 S = 0
输入:3 2
     6 3 7
输出:-1
说明:要求的 k 比任何一个数字都小,不存在窗口
class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long k = scanner.nextLong();
        long[] nums = new long[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextLong();
        }

        // 提前求出相邻两个数的最大公因数
        long[] gcds = new long[n - 1];
        for (int i = 0; i < n - 1; i++) {
            gcds[i] = gcd(nums[i], nums[i + 1]);
        }

        // 滑动窗口
        long maxS = -1;
        long windowS = 0;
        long windowSum = nums[0];
        for(int leftIdx = 0, rightIdx = 1; rightIdx < nums.length; rightIdx++) {
            windowSum += nums[rightIdx];
            windowS += gcds[rightIdx - 1];

            while (leftIdx < rightIdx && windowSum > k) {
                windowSum -= nums[leftIdx];
                windowS -= gcds[leftIdx];
                leftIdx++;
            }

            // 要区分 “窗口大小为 1 时可以” 和 “窗口大小连为 1” 都不可以的情况
            // 只过 90% 就是因为这一句缺了
            if (leftIdx == rightIdx && nums[leftIdx] > k) {
                continue;
            }

            maxS = Math.max(maxS, windowS);
        }

        System.out.println(maxS);
    }

    // 辗转相除法求最大公因数
    private static long gcd(long num1, long num2) {
        if (num2 == 0) {
            return num1;
        } else {
            return gcd(num2, num1 % num2);
        }
    }
}

数据库实操(事后做出):

核心思想是,这些不同的字段关系区别太大,将多个子查询的结果按 Product_Category 这一字段 JOIN 起来,难点是 Top_Sales_Region 字段

DROP TABLE IF EXISTS products_info;
DROP TABLE IF EXISTS sales_info;
DROP TABLE IF EXISTS customer_satisfaction_info;

-- 创建 products_info 表
CREATE TABLE products_info (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(50),
    product_category VARCHAR(20)
);

-- 创建 sales_info 表
CREATE TABLE sales_info (
    sale_id INT PRIMARY KEY,
    product_id INT,
    region VARCHAR(20),
    sale_amount DECIMAL(10, 2)
);

-- 创建 customer_satisfaction_info 表
CREATE TABLE customer_satisfaction_info (
    satisfaction_id INT PRIMARY KEY,
    product_id INT,
    satisfaction_score INT
);

-- 向 products_info 表插入数据
INSERT INTO products_info (product_id, product_name, product_category)
VALUES (1, '产品 A', '股票'),
       (2, '产品 B', '基金'),
       (3, '产品 C', '债券'),
       (4, '产品 D', '股票'),
       (5, '产品 E', '基金'),
       (6, '产品 F', '债券');

-- 向 sales_info 表插入数据
INSERT INTO sales_info (sale_id, product_id, region, sale_amount)
VALUES (1, 1, '华北', 50000.00),
       (2, 1, '华东', 80000.00),
       (3, 2, '华南', 30000.00),
       (4, 2, '华东', 60000.00),
       (5, 3, '华南', 80000.00),
       (6, 3, '华北', 90000.00),
       (7, 4, '华北', 90000.00),
       (8, 5, '华北', 90000.00),
       (9, 6, '华北', 90000.00);

-- 向 customer_satisfaction_info 表插入数据
INSERT INTO customer_satisfaction_info (satisfaction_id, product_id, satisfaction_score)
VALUES (1, 1, 8),
       (2, 2, 7),
       (3, 3, 9),
       (4, 4, 6),
       (5, 5, 7),
       (6, 6, 8);
     
select * from products_info;
select * from sales_info;
select * from customer_satisfaction_info;
-- 自己的解答, 请各位指正
SELECT
	a.Product_Category,
	a.Total_Sales,
	b.Number_of_Different_Product_IDs,
	a.Average_Satisfaction_Score,
	c.Top_Sales_Region
-- 子表 a: 包含 Product_Category, Total_Sales 和 Average_Satisfaction_Score 共 3 个字段
FROM (
	SELECT
		p.product_category AS "Product_Category",
		ROUND(SUM(s.sale_amount), 2) AS "Total_Sales",
		ROUND(AVG(c.satisfaction_score), 2) AS "Average_Satisfaction_Score"
	FROM products_info AS p
	JOIN sales_info AS s
	ON p.product_id = s.product_id
	JOIN customer_satisfaction_info AS c
	ON p.product_id = c.product_id
	GROUP BY p.product_category
) AS a
-- 子表 b: 包含 Number_of_Different_Product_IDs 字段
JOIN (
	SELECT 
		p.product_category AS "Product_Category",
		COUNT(p.product_id) AS "Number_of_Different_Product_IDs"
	FROM products_info AS p
	GROUP BY p.product_category
) AS b ON a.Product_Category = b.Product_Category
-- 子表 c (最难): 获取 Top_Sales_Region 字段
JOIN (
	SELECT
		product_category AS "Product_Category",
		region AS "Top_Sales_Region"
	FROM (
		SELECT
			p.product_category,
			s.region,
			SUM(s.sale_amount) AS sum_up,
			-- 在根据 p.product_category, s.region 分组后, 按 sum_up 列降序计算排序序号
			RANK() OVER (
				PARTITION BY p.product_category
				ORDER BY SUM(s.sale_amount) DESC
			) as rank_sum_up
		FROM products_info AS p
		JOIN sales_info AS s
		ON p.product_id = s.product_id
		GROUP BY p.product_category, s.region
	) AS c1
	-- 序号为 1 的就是销量最大的记录, 选取地区即为所需 Top_Sales_Region 字段
	where rank_sum_up = 1
) AS c ON a.Product_Category = c.Product_Category;

#恒生电子笔试#
全部评论
有面试吗
点赞 回复 分享
发布于 2024-10-10 14:27 浙江
说是8,9号面试,今天7号还没通知呢,有大佬收到面试通知了吗
点赞 回复 分享
发布于 2024-10-07 17:16 湖北
恒生有面试了么大家,我看三个工作日通知面试,但一直也没消息
点赞 回复 分享
发布于 2024-10-01 22:00 山东
哥们有后续吗?
点赞 回复 分享
发布于 2024-09-29 13:15 江西
我是产品表左连满意度表,两个子查询查销售额相关的
点赞 回复 分享
发布于 2024-09-28 01:47 江西
distinct product_id 应该要去重吧,我记得我没去重没过,去重了就过了
点赞 回复 分享
发布于 2024-09-28 01:45 江西
这sql分不要也罢
点赞 回复 分享
发布于 2024-09-27 11:10 江西
同济✌️也来跟我们抢外包?
点赞 回复 分享
发布于 2024-09-27 11:09 重庆
同济大佬也来卷恒生😭
点赞 回复 分享
发布于 2024-09-27 11:04 江西

相关推荐

2025-12-16 22:19
已编辑
南昌市第三中学 Java
个人背景:27届本科&nbsp;江西普通一本院校个人经历:小厂->用友->蔚来->美团->腾讯不知不觉已经有了五段实习经历,也快在外面漂泊一年半了,在今年也完成了两年前自己想进大厂的目标,可能在别人看来确实就是一段比较传奇的过程,一步一步都在向上走,也会有很多人来问我相关学习实习的一些问题,我看到了也会尽量去回复,但现在我想给大家说的并不是千篇一律的学习路线,而是我认为更为重要的——勇气与抉择。下面我来分享一下这些年的心路历程最初学习背景:我跟很多人一样,都是刚进入大学才开始接触计算机,也刚刚拥有自己的电脑,在刚开始学习的过程没有任何人来帮助我,给予我相关的指导,完全是自己摸索出来的一条学习路线,不会有如今这样有很多完善好的速成路线,而家里人都在想让我考研,似乎本科以我的学历就业是不现实的。我也很早意识到了学历对于我的限制,所以萌生出了大一就开始实习的想法,但这个想法在当时基本上是不存在。所有人都在抨击我(这里感兴趣的话可以看我最早发的帖子),有的人说本科想进大厂痴人说梦,有的人劝我以我的学历考研才是上策,有的人说我屁都不懂就来卷,总之我很难说去看到有支持的。我大一的时候还没卷成如今这样很多大一实习,当我想找到是否有跟我一样下定决心一步一步往上走的人,我当时是没有找到的,要么是秋招的哀嚎,要么就直接是零实习进大厂(现在我知道,这里所谓的普通学历0实习进大厂的水分有很多,排除真正意义上的运气和实力,其他基本上全是造假作弊,大家自己心知肚明,也要放平心态)这就导致了一个没有先例的情况,很多人也都是拿没有先例来抨击我,包括家里人也不支持我去实习,可能很多人的积极性就会下降,但我从来不会信所谓的不可能,如果没有先例,那我就会是第一个,他们不行,是因为他们没能力,他们坚持不下去。勇气是很重要的,当你发现你身边没有人像你一样,就很少会有人相信你,看好你,但好在,我不在乎。最初实习阶段:在最初3000沟通只有零星几个面试的时候,那感觉确实很不好受,沉没成本太大,得到的正反馈却太少,当时基本上都是一天学八个小时从来不间断,没有周末没有节假日,甚至过年我都在学习,这就导致我现在都会因为我周末偶尔休息的时候会有负罪感,我感觉已经是种病了,我也知道我也可以休息会但控制不了。当时我出去实习口袋里有1w块(这是我高中三年加大一一年存下来的,基本上是很抠很抠,一个月生活费有时候有一千多有时候就五六百,但也算得上是成功攒了一点钱)但第一次总会是很害怕,担心租房被骗,担心工作能力不行,担心被公司坑,担心学校原因导致不能实习等等,基本上在前面几段实习是根本不攒钱的,代课已经花了一万多,加上租房来回,基本上只能说堪堪不负支出,后来远赴北京,作为一个南方人,有很多不适应的地方,但现在回过头来一想,已经在北京呆了一年多了。我知道很多人要么担心学校因素,要么担心赚的还没花的多,种种因素导致了实习的困难,我也很害怕,我的钱会不会最终全部打水漂,学校会不会爆雷,我以后还能顺利实习吗等等。但对于我来说,我能对自己狠下心,我能接受通勤时间一个半小时只为节省那么几百块的房租钱,我能控制自己的消费的欲望,我能每个月大把大把把钱给代课,这可能就是我能够初期实习顺利的原因,这需要勇气,也需要对自己狠。实习中的抉择:在有了两段实习经历后,我的目标就朝着大厂进发,在去蔚来的中途,我oc了七八家中小厂公司,这里面不乏一些待遇极其优越的公司(有一家我真的差点就去了),但我最终还是都拒了,因为我清楚的明白想往上走的,只有公司title会帮你说话,没有人有义务理解你的困难你的坚持,好在最后去了蔚来,也算如愿以偿。从蔚来到美团倒是没有过多纠结,因为在最开始的梦中情厂就是美团,但从美团去腾讯这个决定或许是我人生中的转折点。美团多次挽留我,帮我沟通问hr,基本上就是一定能转暑期然后成功转正,仿佛这年薪40w的工作已经触手可得,所以在拿到腾讯offer的那一刻并没有多高兴,因为我意识到这可能是我此生最接近大厂的一次机会,可能大部分人都会选择留在美团,我也认为这一定是一个好的选择。我能够走到如今,是永远相信自己的判断,我的每一步都是在赌一个好的未来,只不过,这次赌注大了点而已,或许未来我再也进不了这些所谓的大厂,但我赌的不是选择错对,我赌我不后悔。所谓信念支撑:都说人要为自己而活,但我或许做不到,毕竟我身处人情社会,有许多爱我的人在等着我成长,我也不能接受因为能力而再次放弃一段感情,最近喜欢一段歌词:爱我的人相信我我一直在努力改变所有失败为你们而存在爱我的人感谢你你们的爱就算人生不是精彩我也要勇敢的姿态最后的最后,我想给大家传递的从来都不是一个普通学历进入大厂的意气风发,我想给大家传递的,是一股相信自己能够向上的信念和可能性。在没有打比赛能力,没有开源能力,没有学历等各个限制下,我帮大家试出了一条能够向上的路。如果没有先例,那我会是第一个。我们不需要弄虚作假,只靠自己一步一步脚踏实地,哪怕慢一点,不赌自己是否成功,只赌自己不后悔,问心无愧。最后送给大家,也送给自己一段话结束2025:生活可能没你想的那么好,也不会像你想的那么糟,人的脆弱和坚强,都超乎了你的想象,有时候可能脆弱的一句话就泪流满面,有时候你发现自己咬咬牙已经走了很长的路了
等闲_:感觉咱们双非的同学都有一个共性,想证明双非也是能进大厂的,我之前所有的标签都喜欢带着双非,仿佛这样可以像别人证明自己的实力,现在我却不再想证明双非到底能不能进大厂,我的生活的所有者是我自己,享受生活,接受结果
2025年终总结
点赞 评论 收藏
分享
评论
点赞
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务