大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165
31.华为面试题:
一类似于蜂窝的结构的图,进行搜索最短路径(要求 5 分钟)
题目不懂 内容不懂 跳过吧
32.
有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;
要求:通过交换 a,b 中的元素,使[ 序列 a 元素的和] 与[序列 b 元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
先排序?我第一感觉 先排序 应该可以写。但是 效率估计不好吧。 最后在考虑排序吧。
想了一下 2个数组和 肯定是有差的 我们需要坐的 就是通过 交换 让这个差变小。
每交换一个 比如 a[i] 和 b[j] 交换。 那么 sumnow(a) = sum(a) -a[i]+b[j] sumnow(b) = sum(b) +a[i]-b[j] 相减要尽量等于0 也就是说 sum(a)-sum(b)-2a[i]+2b[j] 要尽量等于0.当然 因为可能需要换多个 所以就变成了
sum(a)-sum(b)-2sum(a[i])+2sum(b[j]). 我还是觉的 排序后 跟舒服。
排序后然后 2个指针 一个在和比较大的 那边的 大数字端 一个在和比较小的 小数字端。
这个思路 出现了一个bug 2组数据 1,18,19 3,13,26 这样的数据 就不行了。 我考虑了一下 没思路 去看答案 。发现 答案 也没有考虑考虑这么复杂 也解决不了这种问题。
还是 应该2个指针 都从小的 或者都从大的出发。每次 自找一个 最符合的 重新排序后 再找。 因为每次自动一个 对排序的压力也不大(我测试懒得用好算法了。 其实 只动一个的排序 应该很快)然后 再重找 知道找不到 更好的为止。
public void test(int[]data1 ,int[]data2){
Arrays.sort(data1);
Arrays.sort(data2);
int i=0;
int j=0;
int sumA=0;
int sumB=0;
for(int data:data1){
sumA+=data;
}
for(int data:data2){
sumB+=data;
}
int def=sumA-sumB;
//这个是记录的 选中交换的2个数 和 需要的2个数 最小差值。
// 比如 sum(a) 是 105 sum(b)是100 这时候 需要 找到2个数 a【i】-b[j] 等于5 可是如果没有这样的数
//就需要找离5最近的 这个 记录的就是 a[i]-b[j]-5 的值 遍历 取绝对值最小的。
//而下面nowI nowJ 就是 最小的index
int minDef=Math.abs(def);
int nowI=0;
int nowJ=0;
boolean sign=false;
while(i<data1.length&&j<data2.length){
int nowdef=2*data1[i]-2*data2[j]-def;
int nowMindef=Math.abs(nowdef);
if(nowMindef<=minDef){
sign=true;
nowI=i;
nowJ=j;
minDef=nowMindef;
}
if(nowdef>0){
j++;
}else{
i++;
}
//--------------------------
}
if(sign){
int d=data1[nowI];
data1[nowI]=data2[nowJ];
data2[nowJ]=d;
test(data1, data2);
}else{
System.out.println("data1");
for(int data:data1){
System.out.print(","+data);
}
System.out.println("data2");
for(int data:data2){
System.out.print(","+data);
}
}
}
测试一下 这个貌似才对。
33.
实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3 这些都要找出来
其实就是类似一些和谐系统。 。 。 。 。
看题目 就是把符合的找出来? 不管顺序? 这样的话 是不是 遍历 用map 存放 然后 在遍历 目的串 全有 就ok了?
这个略简单吧。。不写了
34.实现一个队列。
队列的应用场景为:
一个生产者线程将 int 类型的数入列,一个消费者线程将 int 类型的数出列
生产者消费者线程演示
一个生产者线程将 int 类型的数入列,一个消费者线程将 int 类型的数出列
。。。。。。应该是教材型的吧。也不需要写了吧。 做好同步就好了。