看大神文章小结——微软等面试 31,32,33,34

大神 地址 :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 类型的数出列

。。。。。。应该是教材型的吧。也不需要写了吧。 做好同步就好了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值