给定一个整数年份 n,要求找到大于 n 的最小“幸运年份”。 如果一个年份的各个位上数字均不相同(不含前导零),则称该年份为“幸运年份”。
从 n+1 开始,依次枚举每个年份 y。
将年份 y 转为字符串,检查各个字符是否都不重复:
set 存放字符,若集合大小等于字符串长度,则数字无重复。找到第一个满足条件的年份后输出,继续下一个测试。
import sys
def is_lucky(y):
s = str(y)
# 如果转为集合后长度不变,则各位数字不重复
return len(set(s)) == len(s)
def main():
data = sys.stdin.read().split()
t = int(data[0])
idx = 1
for _ in range(t):
y = int(data[idx]); idx += 1
y += 1
# 循环寻找下一个幸运年份
while not is_lucky(y):
y += 1
print(y)
if __name__ == "__main__":
main()
import java.util.*;
public class Main {
// 检查年份是否幸运
static boolean isLucky(int y) {
String s = Integer.toString(y);
Set<Character> st = new HashSet<>();
for (char c : s.toCharArray()) {
if (!st.add(c)) {
return false; // 出现重复
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
int y = sc.nextInt() + 1;
while (!isLucky(y)) {
y++;
}
System.out.println(y);
}
sc.close();
}
}
#include <bits/stdc++.h>
using namespace std;
// 检查年份是否幸运
bool isLucky(int y) {
string s = to_string(y);
vector<bool> seen(10, false);
for (char c : s) {
int d = c - '0';
if (seen[d]) return false; // 数字重复
seen[d] = true;
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int y;
cin >> y;
y++;
// 枚举直到找到幸运年份
while (!isLucky(y)) {
y++;
}
cout << y << "\n";
}
return 0;
}
如果一个年份的每位数字(不包含前导零)都不相同,则定义这个年份为幸运的。
多多会给出一些年份,对于每个年份,你可以帮忙找出大于这个年份的最小幸运年份吗。
第一行,包含一个正整数 T(1≤T≤10) 代表测试数据的组数。 对于每组测试数据,仅有一行正整数n(0≤n≤106),表示多多给出的年份。
对于每组数据,输出一行正整数,表示大于给出年份的最小幸运年份
输出不包含前导零
输入
2
1881
2211
输出
1890
2301