大神 地址 :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分钟 不过写代码 不止了 超过半小时了 貌似。中间出错。调试了一下