京东笔试 含有4,7的幸运数,找第k个幸运数

/*
 * @funcion 京东笔试  找幸运数  4,7,44,47,74,77,444,447
 * 第5个幸运数是74 根据此规律找出第k个幸运数。
 * 
 * 思路:1位数有2个幸运数,2位数有4个幸运数,3位数有8个幸运数......故n位数的时候,有2的n次方个幸运数
 * 		根据k,找出它为几位数,进而得出它是在j位中的第几个数。比如第5个幸运数是74,属于两位数,在两位数中的第3位
 * 		我们通过2进制(即0,1)来解决问题
 * 		2位数的2进制,有00,01,10,11,第3个即10,把1作7,0作4,输出便是74.
 */
package String;
import java.util.Scanner;
public class Test {
	
   public static void main(String... args){
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        long [] arr = new long[m];
        for(int i = 0;i < m;i++){
        	arr[i] = in.nextLong();
        }
        in.close();
        method(arr);
    }
   /*
    * @param int j 找出第k个幸运数属于j位数  比如第5个幸运数是74,属于两位数
    * @param double kth 找出第k个幸运数在j位数中的第几个,比如74在两位数中的第3位
    */
    public static void method(long [] arr){
    	double kth = 0;
    	int j = 0;
    	double result = 0;
    	for(int i = 0;i < arr.length;i++){    StringBuilder sb = new StringBuilder();
    	    while(result<arr[i]){
    	        j++;   //求出是几位数
    	        result = Math.pow(2, j) + result;
    	    }
    	    kth = arr[i]+2 - Math.pow(2,j);  //求出在j位数的第几个数kth
    	    int kthint = (int)kth -1; 
	    String str = Integer.toBinaryString(kthint);  //转成2进制数
	    /*
	    * 当j=3,kth=1时,kth-1转换成2进制为0,故需补两个0在前面
	    */
	    for(int k = str.length();k < j;k++){
		sb.append("0");
	    }
	    sb.append(str);
	    System.out.println(sb.toString().replace('1', '7').replace('0', '4')); //输出结果
    	}
    }
}


ps:昨天漏了一步没有ac出来(泪奔.....),今天找了找原因,重新写了一下
    

全部评论
我实现的C++版本代码 #include<iostream> #include<cmath> #include<string> using namespace std; string getnext(int size, int k) { string res(size,'0'); for (int i = size - 1; i >= 0; i--) { if (k % 2 == 0)k = k / 2; else { k = k / 2; res[i] = '1'; } } for (int i = 0; i < size; ++i) { if (res[i] == '0')res[i] = '4'; else res[i] = '7'; } return res; } int main() { int k; while (cin >> k) { int size = 1; int i = 1; while (1) { if (k > pow(2, i)) { k = k - pow(2, i); i++; size++; } else { break; } } cout << getnext(size,k-1) << endl; } cin.get(); return 0; }
点赞 回复 分享
发布于 2016-09-06 17:30
#include<iostream> #include <string> using namespace std; int main(void) { int T; long long K; long long n,m; cin >> T; while (T--) { cin >> K; n = 2; m = 1; while (K - n > 0) { K -= n; n <<= 1; ++m; } --K; string out(m,'4'); while (m--) { if (K&0x1) { out[m] = '7'; } K >>= 1; } cout << out << endl; } return 0; }
点赞 回复 分享
发布于 2016-09-06 21:02
我的 #include<stdio.h> #include<iostream> #include<string> using namespace std; int main(){ int T; cin >> T; while(T--){ long long K; cin >> K; string ret; K = K-1; long long temp = 1; while(K>0){ temp = temp*2; if(K%temp<temp/2) ret = '4'+ret; else ret = '7'+ret; K = K-temp; } cout << ret <<endl; } return 0; }
点赞 回复 分享
发布于 2016-09-07 11:07
#include <string> #include <iostream> #include <algorithm> using namespace std; string get_next(string& str) { int len = str.length(); if (len == 0)return string(""); bool num4 = false; for (int i = len - 1; i >= 0; i--) { if (str[i] == '4') {  str[i] = '7';  num4 = true;  break;  } } if (!num4) { return string(len + 1, '4'); } return str; } string Helper(int n) { if (n <= 0)return ""; string result=string("4"); if (n == 1)return result; while (--n) { result = get_next(result); } return result; } int main() { int n; while (cin >> n) { cout << Helper(n) << endl; } return 0; }
点赞 回复 分享
发布于 2016-09-07 14:18
public static String solution(int n){ StringBuffer sb = new StringBuffer(); int wei = (int)(Math.log(n+1)/Math.log(2)); // 求出第n个幸运数的位长度 int num = n - ((int)Math.pow(2,wei)-1); // 求出第n个幸运数在该层的位置值 String binNum = Integer.toBinaryString(num); for(int i = 0 ; i < wei-binNum.length() ; i++) { sb.append("0"); } sb.append(binNum); String luckyNum = sb.toString(); luckyNum = luckyNum.replace("0", "4"); luckyNum = luckyNum.replace("1", "7"); return luckyNum; }
点赞 回复 分享
发布于 2016-09-14 14:39

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务