校招算法笔面试 | 校招笔面试真题-列表补全

题目

题目链接

解题思路

这是一道关于分页展示的区间计算问题,需要计算两个列表L1和L2在当前页面的展示区间。主要思路如下:

  1. 对于L1列表:

    • 起始位置: min ⁡ ( l 1 , o f f s e t ) \min(l1, offset) min(l1,offset)
    • 结束位置: min ⁡ ( l 1 , o f f s e t + n ) \min(l1, offset+n) min(l1,offset+n)
  2. 对于L2列表:

    • 起始位置: min ⁡ ( max ⁡ ( o f f s e t − l 1 , 0 ) , l 2 ) \min(\max(offset-l1, 0), l2) min(max(offsetl1,0),l2)
    • 结束位置: min ⁡ ( max ⁡ ( o f f s e t + n − l 1 , 0 ) , l 2 ) \min(\max(offset+n-l1, 0), l2) min(max(offset+nl1,0),l2)

关键点:

  • 需要考虑offset可能超过L1长度的情况
  • 需要考虑分页长度n可能超过列表总长度的情况
  • 使用 max ⁡ ( x , 0 ) \max(x,0) max(x,0) 确保不会出现负数索引
  • 使用 min ⁡ \min min 确保不会超过列表长度

代码

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int offset, n, l1, l2;
    while (cin >> offset >> n >> l1 >> l2) {
        // L1的区间
        int start1 = min(l1, offset);
        int end1 = min(l1, offset + n);
        
        // L2的区间
        int start2 = min(max(offset - l1, 0), l2);
        int end2 = min(max(offset + n - l1, 0), l2);
        
        cout << start1 << " " << end1 << " " 
             << start2 << " " << end2 << endl;
    }
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int offset = sc.nextInt();
            int n = sc.nextInt();
            int l1 = sc.nextInt();
            int l2 = sc.nextInt();
            
            // 计算L1的区间
            int start1 = Math.min(l1, offset);
            int end1 = Math.min(l1, offset + n);
            
            // 计算L2的区间
            int start2 = Math.min(Math.max(offset - l1, 0), l2);
            int end2 = Math.min(Math.max(offset + n - l1, 0), l2);
            
            System.out.printf("%d %d %d %d\n", start1, end1, start2, end2);
        }
    }
}
while True:
    try:
        offset, n, l1, l2 = map(int, input().split())
        
        # 计算L1的区间
        start1 = min(l1, offset)
        end1 = min(l1, offset + n)
        
        # 计算L2的区间
        start2 = min(max(offset - l1, 0), l2)
        end2 = min(max(offset + n - l1, 0), l2)
        
        print(start1, end1, start2, end2)
    except EOFError:
        break

算法及复杂度

  • 算法:简单的数学计算
  • 时间复杂度: O ( 1 ) \mathcal{O}(1) O(1) - 每组输入只需要进行简单的数学运算
  • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1) - 只需要存储几个整数变量
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值