给定正整数n,返回在[1, n]范围内具有 至少 1 位 重复数字的正整数的个数。
示例 1:
输入:n = 20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。
示例 2:
输入:n = 100
输出:10
解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100 。
示例 3:
输入:n = 1000
输出:262
使用hashset可以去重的特性,将数字转换为字符(不知道效率高不高,但是实现起来比较容易,逻辑简单)
package exer1;
import java.lang.invoke.CallSite;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
/*
给定正整数n,返回在[1, n]范围内具有 至少 1 位 重复数字的正整数的个数。
示例 1:
输入:n = 20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。
* */
public class exer1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数");
int n = sc.nextInt();
String s;
int num = 0;
HashSet hs = new HashSet(); // 创建HashSet集合对象
List list = new ArrayList();
for (int i = 10; i <= n; i++) {
s = String.valueOf(i);//n转换为字符串
char[] arr = s.toCharArray();
for (Object c : arr) { // 遍历字符数组
hs.add(c); // 将字符数组中的字符添加到集合中
}
for (Object c : arr) { // 遍历字符数组
list.add(c); // 将字符数组中的字符添加到集合中
}
if (hs.size() == list.size()) {//hashset会去重;不能使用equals和==,因为hs会排序
hs.clear();
list.clear();
} else {
num++;
hs.clear();
list.clear();
}
}
System.out.println("--------------------");
System.out.println("有重复数字的一共有"+num);
}
}