Prev10 历届试题 幸运数
题目如下:
这题我看了挺久的,想来想去还是决定来一发暴力模拟,然后就过了…
讲道理蓝桥这数据确实水,n最大可以到1000000的,我测了一下1到1000000的,然后远远超出了1s。哎,水杯还是有道理的(滑稽)
然后我自己又用链表来试了一下,其实还是差不多的,虽然链表删除很方便,但这块也是需要时间的,所以还是超时。
看了网上很多的题解,没一个1到1000000能1秒内的。看了过程,虽然有很多用集合和dfs写的,但本质还是暴力出来的。所以哪位大哥有好想法可以说一下
package prev;
import java.util.Scanner;
/**
* @Description: 历届试题 幸运数
* @ClassName: Prev10
* @author: fan.yang
* @date: 2020/09/17 16:44
*/
public class Prev10 {
//暴力模拟
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int[] a = new int[n];
int index = 0;
//只取n之前的奇数 能节省一半空间
for(int i = 1;i < n;i += 2){
a[index++] = i;
}
//这个index其实就是数字的个数
//注意这个count 这是每次筛选完后数字个数
int k,count = index;
//i=1开始 就是第二个数字
for(int i = 1;i < index;i++){
//因为方便 筛选掉的数字我会置0 如果是真删除要移动数组的 那更麻烦
//所以遇到0直接跳过
if(a[i] == 0){
continue;
}
//如果a[i]大于当前数字个数 那么就可以结束了 因为已经筛选不掉数字了
if(a[i] > count){
break;
}
//记录当前幸运数
k = a[i];
count = 0;
for(int j = 0,sum = 0;j < index;j++){
if(a[j] == 0){
continue;
}
count++;
//当数字序号位置达到了k 那么就筛掉(置0)
if(++sum == k){
sum = 0;
a[j] = 0;
count--;
}
}
}
int sum = 0;
for(int i = 0;i < index;i++){
if(a[i] > m) sum++;
}
System.out.println(sum);
}
}