京东幸运数求解

用的最暴力的方法,想好久没想到快速解法。。
全部评论
暴力过了80%,知道应该优化一下。现在一想,其实就是简单的求和超过了32(或者64?)就可以直接忽略该数不用算下去。
点赞 回复 分享
发布于 2016-09-05 21:25
不需要暴力求解,其实你可以把它想象成一个0 1字符串,然后就行求解即可。 public static void main(String args[]) { Scanner reader = new Scanner(System.in); while (reader.hasNextLine()) { int num = Integer.parseInt(reader.nextLine()); for (int i = 0; i < num; i++) { int count = Integer.parseInt(reader.nextLine()); if (count == 1) { System.out.println(4); continue; } if (count == 2) { System.out.println(7); continue; } int a = 1; while (Math.pow(2, a) - 2 < count) { a++; } count = (int) (count - Math.pow(2, a - 1) + 2); count--; StringBuilder sb = new StringBuilder(); for (int j = 0; j < a - 1; j++) { int index = 1 << j; if ((count & index) == 0) { sb.append("4"); } else { sb.append("7"); } } System.out.println(sb.reverse().toString()); } } }
点赞 回复 分享
发布于 2016-09-05 21:23
//题目是不一样的,我是2进制和10进制 import java.util.Scanner; public class Main { public static void main(String args[]) { boolean[] B = new boolean[100000 + 1]; for (int i = 1; i < 100000 + 1; i++) { int binary =g(i); int ten = f(i); if (binary == ten) B[i] = true; } Scanner cin = new Scanner(System.in); int times = cin.nextInt(); for (int i = 0; i < times; i++) { int n = cin.nextInt(); int count = 0; for (int j = 1; j <= n; j++) {{ if (B[j]) count++; } } System.out.println(count); } } private static int f(int num){ String str = String.valueOf(num); int sum = 0; for(int i = str.length() - 1;i>=0;i--){ sum+=Integer.valueOf(str.charAt(i)+""); } return sum; } private static int g(int num){ String str = Integer.toBinaryString(num); int sum = 0; for(int i = 0;i<str.length();i++){ sum+=Integer.valueOf(str.charAt(i)+""); } return sum; } }
点赞 回复 分享
发布于 2016-09-05 21:27
#include <iostream> #include <string> #include <cmath> #include <vector> using namespace std; string getKthNum(long long k) {     if (k == 1) {         return "4";     } else if (k == 2) {         return "7";     }     int numPos = ceil(log(k + 2.0) / log(2.0) - 1);     long long prevNum = pow(2.0, numPos) - 2;     long long nowNum = k - prevNum;     long long halfNum = pow(2.0, numPos - 1);     string postStr = getKthNum((nowNum > halfNum ? nowNum % halfNum : nowNum) + halfNum - 2);     string prevStr = (nowNum > halfNum) ? "7" : "4";     return prevStr + postStr; } int main() {     int n;     cin >> n;     vector<string> retVec;     while (n--) {         long long k;         cin >> k;                  string ret = getKthNum(k);         retVec.push_back(ret);     }     for (int i = 0; i < retVec.size(); i++) {         cout << retVec[i] << endl;     } return 0; } 从第k个数倒推有多少位,在用递归解
点赞 回复 分享
发布于 2016-09-05 21:23
我用java超时了,最后那个第1000000000,我程序用了4s跑出来
点赞 回复 分享
发布于 2016-09-05 21:21

相关推荐

春招第一个笔试,总的来说挺简单的,第1,3,4题AC了,第2题超时了,只过了40%。第1题是给定坐标,有四个操作WASD,可以分别往上左下右四个方向走一格,然后给了一系列操作,问能否回到原点(0,0)。第2题是给了区间范围[left,right],求幸运数有几个。幸运数的定义是:如果该数存在一个子数字能被3整除,那该数就是幸运数,子数字必须是连续的,例如123,12是子数字,但13不是。我觉得难点在于找到一个数的所有子数字,我是用滑动窗口来做的,有两层for&nbsp;loop,所以超时了。第3题本质上就是单调栈,有很多人排队,身高不一样,可以看到右边所有比自己矮的人,直到有一个身高大于等于自己的人挡住了视线,问每个人可以看到的人的总和。其实就是找到每个人右边第一个身高大于等于自己的人的坐标。第4题看起来很复杂,其实就是模拟,不涉及任何算法。给定字符串A,B和下标序列X,X中存储A的下标,顺序是随机的且允许重复,可以随意的调整X和B中元素的顺序,然后要遍历X中的下标,将A中对应位置的元素与B中对应位置的元素调换顺序,求新的A的最小的字典顺序。我是将X和B分别从小到大排列,然后对X去重。另外问一下各位,我是在boss直聘上被hr直接投递了简历,导致校招官网根本没有我的账号信息和流程,该怎么办?
查看5道真题和解析 投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务