看大神文章小结——微软面试5,6

大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165


5.查找最小的k个元素(数组)

题目:输入n个整数,输出其中最小的k个。

例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。


读题 首先想到就是 利用k个变量(数组?)记录着最小的 有更小的就更新。最简单的方法 肯定是用一个数组每次循环比较。有更小的 就把最大的替换掉。 但是 毫无疑问 这个算法性能很差。先做一版这样的吧。

	public List<Integer> getMinList(List<Integer> data,int count){
		int minData=Integer.MAX_VALUE;
		int maxData=Integer.MIN_VALUE;
		List<Integer> minList=new ArrayList<Integer>(count);
		for(int i:data){
			if(minList.size()<count){
				minList.add(i);
				if(minData>i){
					minData=i;
				}
				if(maxData<i){
					maxData=i;
				}
			}else{
				if(i<maxData){
					if(i<minData){
						minData=i;
					}
					int nowMax=Integer.MIN_VALUE;
					for(int j=0;j<count;j++){
						int nowData=minList.get(j);
						if(nowData==maxData){
							//minList.add(j, i);
							minList.set(j, i);
						}else if(nowData>nowMax){
							nowMax=nowData;
						}
					}
					maxData=nowMax;
				}
			}
		}
		
		return minList;
	}

这个测试了一下 貌似没问题。 当然 很明显 可能性能不够好 原因就是 每次有 更小的进来的时候移除最大的值的时候。接下来的最大值 就不知道了。如果记录最小的值的 list 是有序的 。或者是树结构 应该会好点吧。代码就不写了。 因为 改成有序的 或者树 挺简单了。至于性能会好多少。反正写了 我自己也没数。。



第6题(数组)
腾讯面试题: 
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 
要求下排每个数都是先前上排那十个数在下排出现的次数。 
上排的十个数如下: 
【0,1,2,3,4,5,6,7,8,9】

举一个例子, 
数值: 0,1,2,3,4,5,6,7,8,9 
分配: 6,2,1,0,0,0,1,0,0,0 
0在下排出现了6次,1在下排出现了2次, 
2在下排出现了1次,3在下排出现了0次.... 
以此类推..


看了10分钟的限制。貌似有点急啊。完全无法下手。给自己放宽一点 慢慢想吧。难道 一次次循环来设置 直到值可以?我的大脑感觉想不到这样会不会出问题 。先写代码试试吧

public class Main {
	//int[]dataA={0,1,2,3,4,5,6,7,8,9};
	int[]dataA={1,6,2,7,4,5,9,0,8,9};
	int []dataB=new int[10];
	boolean success=false;
	public void doMian(){
		while(!success){
			setData();
		}
		for(int i :dataB){
			System.out.println(i);
		}
	}
	private void setData(){
		System.out.println("setData");
		success=true;
		for(int i=0;i<dataA.length;i++){
			int num=dataA[i];
			int count=0;
			
			for(int j=0;j<dataB.length;j++){
				if(dataB[j]==num){
					count++;
				}
			}
			
			if(dataB[i]!=count){
				dataB[i]=count;
				success=false;
				System.out.println("false");
			}
		}
	}
	
	public static void main(String[] args) {
		Main main =new Main();
		main.doMian();

	}
}

完成了 这样居然可以。 测试了一下 貌似也是对的。 不过有没有更好的办法? 大神给的答案是 c的 不懂。。。小看了一下。貌似逻辑差不多也是这样的?? 不确定。c语言忘了。就这样吧。思路也没花10分钟 不过写代码 不止了 超过半小时了 貌似。中间出错。调试了一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值