一道华为面试题
2012-05-17 09:45
211 查看
有两个序列a,b,大小都有n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最小。
例如:
var a = [100, 99, 98, 1, 2, 3];
var b = [1, 2, 3, 4, 5, 40];
package com.tourism;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
public class Test {
protected static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
List<Integer> a = Lists.newArrayList(100, 99, 98, 1, 2, 3);
List<Integer> b = Lists.newArrayList(1, 2, 3, 4, 5, 40);
Collections.sort(a);
Collections.sort(b);
int totalA = 0, totalB = 0;
for (int i : a) {
totalA += i;
}
for (int i : b) {
totalB += i;
}
int curDiff = Math.abs(totalA - totalB);
for (int i = a.size() - 1; i >= 0; i--) {
for (int j = b.size() - 1; j >= 0; j--) {
int chgTotalA = totalA - a.get(i) + b.get(j);
int chgTotalB = totalB - b.get(j) + a.get(i);
int chgDiff = Math.abs(chgTotalA - chgTotalB);
if (chgDiff < curDiff) {
curDiff = chgDiff;
totalA = chgTotalA;
totalB = chgTotalB;
int temp = a.get(i);
a.set(i, b.get(j));
b.set(j, temp);
}
}
}
logger.info("a:{}", a);
logger.info("b:{}", b);
}
}
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最小。
例如:
var a = [100, 99, 98, 1, 2, 3];
var b = [1, 2, 3, 4, 5, 40];
package com.tourism;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
public class Test {
protected static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
List<Integer> a = Lists.newArrayList(100, 99, 98, 1, 2, 3);
List<Integer> b = Lists.newArrayList(1, 2, 3, 4, 5, 40);
Collections.sort(a);
Collections.sort(b);
int totalA = 0, totalB = 0;
for (int i : a) {
totalA += i;
}
for (int i : b) {
totalB += i;
}
int curDiff = Math.abs(totalA - totalB);
for (int i = a.size() - 1; i >= 0; i--) {
for (int j = b.size() - 1; j >= 0; j--) {
int chgTotalA = totalA - a.get(i) + b.get(j);
int chgTotalB = totalB - b.get(j) + a.get(i);
int chgDiff = Math.abs(chgTotalA - chgTotalB);
if (chgDiff < curDiff) {
curDiff = chgDiff;
totalA = chgTotalA;
totalB = chgTotalB;
int temp = a.get(i);
a.set(i, b.get(j));
b.set(j, temp);
}
}
}
logger.info("a:{}", a);
logger.info("b:{}", b);
}
}
相关文章推荐
- 那天在CSDN上看到一个网友在华为遇到的面试题是一道乘法题看似简其实并不是因为它们都超出了数据类型的范围,今天做了下加法希望对大家有所启示
- 传说这是一道华为的面试题
- 华为的一道C语言面试题
- 华为一道面试题
- 华为的另一道面试题,有关union的sizeof()的问题
- 华为的一道面试题的解答(自己的另解)
- 华为一道c语言面试题
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 关于一道1到N自然数排序的华为面试题
- 简单一道排序题,考倒多少读书人!——从华为一道面试题浅谈计算机专业在校大学生该如何学习专业课程,信心百倍挑战就业!
- 一道华为面试题,关于程序优化的
- 华为的一道面试题的解答
- 背包算法解决一道华为面试题
- 华为的一道初步面试题,面试C++的
- 一道算法题:华为面试题
- 一道华为面试题
- 华为的一道面试题
- 关于华为一道面试题 ( ++a )和( a++ ) .
- 华为(2007年3月)一道面试题: c语言删除一个字符串中的第i个字符后的j个字符
- 2012年校园招聘华为一道面试题---之我的解法