恒生电子笔试交流 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 江西

相关推荐

想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
评论
点赞
13
分享

创作者周榜

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