关于京东笔试幸运数字
首先关于f(x)函数和g(x)函数,我是这样写的,效率肯定不高,但是反正能用
// 定义f(x)函数 public static int f(int x) { int sum = 0; int temp = x; while (temp != 0) { sum += temp % 10; temp /= 10; } return sum; } //定义g(x)函数 public static int g(int x) { int sum = 0; int temp = x; while (temp != 0) { sum += temp % 2; temp /= 2; } return sum; }
然后我取了巧,题目中说明了,数组的组数T<10000,每组数n<100000
然后我之前每次提交的时候都是说我时间超限~~~估计这编译器要求要快吧。所以其实需要把幸运数字记录下来。
int[] record = new int[1000001]; //直接计算1到100000 luckyNumberCountBetweenXAndY(1,100000); //从x到y之间的luckyNumber数量 public static void luckyNumberCountBetweenXAndY(int x,int y){ for(int j=x;j<=y;j++){ if(f(j)==g(j)){ record[j] = true; }else{ record[j] = false; } } }
简单说就是直接计算1-100000的幸运数字,记录哪些是幸运数字,然后算的时候直接根据布尔数组统计就可以了,这样速度应该会快很多。
可惜我想到这个方法的时候还有几分钟的了~~~~
最后编译的结果是说我的结果错了(糟心的OJ,就只知道结果错误,不给具体的结果,真的不知道哪里错了啊~~~)