京东的笔试

昨天做了京东的笔试题,第二次做了,感觉越来越难了,应该是自己的知识掌握得不够牢固吧。一些没见过的题,现在也不记得了

这里主要是一些常见的题,但又没有很完整的解答出来,记录一下,也能涨不少知识。

目录:

1.Hashtable,HashMap,CurrentHashMap的区别,对线程连接池的理解

2.synchronized和volatile的区别和联系。
3.java编程规范有哪些
4.编程题两道

具体解答:

1.Hashtable,HashMap,CurrentHashMap的区别,对线程池的理解

ConcurrentHashMap详解

HashMap详解

Hashtable详解

线程池详解

作者: chenssy 
出处: http://cmsblogs.com/?p=618 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

2.synchronized和volatile的区别和联系

详解

3.java编程规范

详细解答

4.两道编程题?

第一道是关于幸运数字的:

给一个整数,十进制求出给位相加的和与转换成二进制之后各位相加的和是否相等,对于一个数,求小于等于该数的所有满足该条件的数有多少个。

要求第一行输入n,表示要输入n个数,后面输入n个数,然后依次输出结果:

比如:

输入:

3
1
2

21
输出:

1
1
3

我当时写了一个程序,实现了功能,但最终超时了。代码如下:


import java.util.Scanner;

public class Main {

	public static void mainfunc(){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] store=new int[n];
		//分析,光计算里面就有四次循环,第一个循环是必不可少的,但后面两个循环就多余了
		//三重嵌套循环,在计算幸运数字的时候,每次递减来比较太耗时间了
		//幸运数字并不多,最多就六十多个,此时,可以将幸运数字存起来,100000的数组
		while(n>0){
			int a=sc.nextInt();
			for(int tag=a;tag>0;tag--){
				func(tag,store,n);
			}
			n--;
		}
		for(int t=0;t<store.length;t++){
			System.out.println(store[t]);
		}
	}
	public static void main(String[] args) {
	
		long start=System.currentTimeMillis();
		mainfunc();
		long end=System.currentTimeMillis();
		System.out.println(end-start);
		
	}
	public static void func(int a,int[] store,int tag){
		int i=store.length;
		int a_int=0;
		int a_binary=0;
		int temp=a+10;
		while(temp/10!=0){
			a_int+=temp%10;
			temp=temp/10;
		}
		a=a+2;
		while(a/2!=0){
			a_binary=a%2;
			a=a/2;
		}
		if(a_binary==a_int){
			++store[i-tag];
		}
	}
}

最后改进了一下,用数组存储了所有结果,这样每次输入就不用都去循环计算了,这个应该能通过:

import java.util.Scanner;

public class test2 {

	public static void mainfunc(){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		//定义一个超大数组,然后将幸运数字存储起来
		int num[]=new int[100001];
		func(100001,num);
		int[] store=new int[n];//储存幸运数字个数
		int i=0,a;
		while(i<n){
			a=sc.nextInt();
			store[i++]=num[a];
		}
		for(i=0;i<n;i++){
			System.out.println(store[i]);
		}
	}
	//用空间来换时间
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long start=System.currentTimeMillis();
		mainfunc();
		long end=System.currentTimeMillis();
		System.out.println(end-start);
	}
	public static void func(int b,int[] store){
		int i=1;
		int tag=0;//幸运数字的递增
		int a;//作为临时的变量
		while(i<b){
			a=i;
			int a_int=0;
			int a_binary=0;
			int temp=a+10;
			while(temp/10!=0){
				a_int+=temp%10;
				temp=temp/10;
			}
			a=a+2;
			while(a/2!=0){
				a_binary=a%2;
				a=a/2;
			}
			if(a_binary==a_int){
				tag++;
			}
			store[i++]=tag;
		}
		}
}

第二题:

// 时间限制:C/C++语言 1000MS;其他语言 3000MS
// 内存限制:C/C++语言 65536KB;其他语言 589824KB
// 题目描述:
// 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字。前几个幸运数字为:4,7,44,47,74,77,444,447... 
// 现在输入一个数字K,输出第K个幸运数。

还未做。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值