解题思路
这是一道关于分页展示的区间计算问题,需要计算两个列表L1和L2在当前页面的展示区间。主要思路如下:
-
对于L1列表:
- 起始位置:
- 结束位置:
- 起始位置:
-
对于L2列表:
- 起始位置:
- 结束位置:
- 起始位置:
关键点:
- 需要考虑offset可能超过L1长度的情况
- 需要考虑分页长度n可能超过列表总长度的情况
- 使用
确保不会出现负数索引
- 使用
确保不会超过列表长度
代码
#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
算法及复杂度
- 算法:简单的数学计算
- 时间复杂度:
- 每组输入只需要进行简单的数学运算
- 空间复杂度:
- 只需要存储几个整数变量