华为06年面试题——求交换数组元素后差值最小方案
2015-12-09 14:52
260 查看
华为06年面试题(要求8分钟完成)
题目:
有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:
通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
代码:
代码简析:
使数组中的每个元素都先交换,再对比交换前后的差值大小,差值变大的话,就取消交换,差值变小的话,就继续下一个元素的交换。
注:
完成时间超过8分钟,耗时约20分钟。
题目:
有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:
通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
代码:
#include <stdio.h> #include <math.h> void print_array(int *arr, int n); void exchange(int *a, int *b); int sum(int *p, int n); int main() { int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 989 }; int b[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 }; int i, j, min, suma, sumb, minus = 0; int n = sizeof(a)/sizeof(int); suma = sum(a, n); sumb = sum(b, n); min = suma > sumb ? suma : sumb; print_array(a, n); print_array(b, n); putchar('\n'); for (i = 0; i < n; i++) { for (j = 0; j < n;j++) { exchange(&a[i], &b[j]); minus = abs(sum(a, n) - sum(b, n)); if (minus < min) { min = minus; continue; } else exchange(&a[i], &b[j]); } } print_array(a, n); printf ("sum = %d\n", sum(a, n)); print_array(b, n); printf ("sum = %d\n", sum(b, n)); printf ("minus = %d\n", min); getchar(); getchar(); return 0; } void exchange(int *a, int *b) //交换两个元素的值 { int temp; temp = *a; *a = *b; *b = temp; } int sum(int *p, int n) //计算数组元素的总和 { int i, sum = 0; for (i = 0; i < n; i++) { sum += *(p + i); } return sum; } void print_array(int *arr, int n) //打印数组元素 { int i, sum = 0; for (i = 0; i < n; i++) { printf ("%d\t", *(arr + i)); } putchar('\n'); }
代码简析:
使数组中的每个元素都先交换,再对比交换前后的差值大小,差值变大的话,就取消交换,差值变小的话,就继续下一个元素的交换。
注:
完成时间超过8分钟,耗时约20分钟。
相关文章推荐
- java工程师面试经典题目整理
- 成为一名更好的程序员,需要懂什么?
- 中软国际Java程序员笔试题
- 2015年-Google北京区-software engineering intern-面试经验
- 《疯狂的程序员》
- 作为程序员必知的16个最佳PHP库
- hadoop面试100道收集(带答案)
- 黑马程序员—java基础复习—多态和内部类
- 常见面试问题-介绍一下如何优化MySql???
- PHP程序员如何理解IoC/DI(转)
- 前端程序员的自我修养
- 黑马程序员——OC之protocol
- 理想的程序员
- 软件开发人员的作战手册 - 让程序员活的久一点
- 求职面试三法则
- 面试之十大不可说
- 求职,不要怕被别人看低
- Java程序员必知的10个调试技巧
- 35岁程序员的独家面试经历
- 黑马程序员---易错、易望、基础、重要知识点——java中最常用的两种排序方式