免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: forrestgang
打印 上一主题 下一主题

华为面试题(8分钟写出代码) [复制链接]

招聘 : 产品经理/专
论坛徽章:
0
401 [报告]
发表于 2013-07-12 16:23 |只看该作者

a = a1 a2 a3 ... an
b = b1 b2 b3 ... bn

合并a b到数组c并排序   c = c1 c2 c3 ... c2n

1.将c2n 赋给 a
2.将c2n-1 赋值给 b
3.for(int i = 2n-2; i >= 0; i--)           //写法不太准确,意思循环剩下的c数组
{
    if(b数组之和+ci < a数组之和)          //可能有些问题,if(b数组之和+ci < a数组之和),此时ci不好判断是放在a里还是b里  还是说循环放一次放a 下一次放b
         将ci赋值给b
         将ci 从数组c中删除(标记下次不再取就行)
}

论坛徽章:
0
402 [报告]
发表于 2013-07-12 21:54 |只看该作者

论坛徽章:
1
狮子座
日期:2013-09-06 17:18:40
403 [报告]
发表于 2013-07-13 18:55 |只看该作者
这个不是典型的插入排序吗?  但是我不知道怎么写代码了   得复习去啦

论坛徽章:
0
404 [报告]
发表于 2013-07-20 10:45 |只看该作者
先把两个数组合并到一起从大到小排序,然后从头开始取数,如果当前数组A的和大于数组B的和,让B取,否则A取,如果A数组的数量到了n个就都让B取,B反之亦然.

论坛徽章:
0
405 [报告]
发表于 2013-07-26 17:08 |只看该作者
#include "stdio.h"
#include "stdlib.h"

int a[] = {6,0,8};
int b[] = {2,1,9};


int getsum()
{
       int sum = 0;
        int sum1 = 0;
        for(int i = 0; i < 3; i++)
        {
                sum += a[i];
                sum1 += b[i];
        }
        return abs(sum - sum1);
}

int main()
{
        int tt = getsum();
        for(int i = 0; i < 3; i++)
        {
                for(int j = 0; j < 3; j++)
                {
                        int t = a[i];
                        a[i] = b[j];
                        b[j] = t;
                        if(getsum() < tt)
                        {
                                tt = getsum();
                        }
                        else
                        {
                                t = a[i];
                                a[i] = b[j];
                                b[j] = t;
                        }

                }
        }

        for(int i = 0; i < 3; i++)
        {
                printf("%d, %d\n", a[i], b[i]);
        }
        return 0;
}

论坛徽章:
0
406 [报告]
发表于 2013-09-24 12:54 |只看该作者
xmyth 发表于 2006-11-14 17:04
当前数组a和数组b的和之差为
A = sum(a) - sum(b)
  1. /**
  2. * http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=855126&page=8#pid6022430
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <time.h>

  8. int
  9. sum_array(int *a, int n)
  10. {
  11.         int i, sum = 0;
  12.         for(i = 0; i < n; i++)
  13.                 sum += a[i];
  14.         return sum;
  15. }

  16. void
  17. do_swap(int *a, int *b, int n)
  18. {
  19.         int A, i, j, x, d, m, si, sj, *ap, *bp;

  20. do_start:
  21.         i = sum_array(a, n);
  22.         j = sum_array(b, n);
  23.         A = i - j;
  24.         ap = a;
  25.         bp = b;
  26.         if(A < 0) {
  27.                 ap = b;
  28.                 bp = a;
  29.                 A = j - i;
  30.         }
  31.        
  32.         m = A;
  33.         si = sj = -1;
  34.         for(i = 0; i < n; i++){
  35.                 for(j = 0; j < n; j++) {
  36.                         x = ap[i] - bp[j];
  37.                         if(x > 0 && x < A) {
  38.                                 d = abs((x * 2) - A);
  39.                                 if(d < m) {
  40.                                         m = d;
  41.                                         si = i;
  42.                                         sj = j;
  43.                                 }
  44.                         }

  45.                 }
  46.         }

  47.         if(si != -1) {
  48.                 i = ap[si];
  49.                 ap[si] = bp[sj];
  50.                 bp[sj] = i;
  51.                 goto do_start;
  52.         }
  53. }

  54. void
  55. dump_array(int *a, int n)
  56. {
  57.         int i;
  58.         printf("\n");
  59.         for(i = 0; i < n; i++) {
  60.                 printf(" %d ", a[i]);
  61.         }
  62. }

  63. void
  64. mk_rand_int_array(int *a, int n)
  65. {
  66.         int i, r;
  67.         for(i = 0; i < n; i++) {
  68.                 r = rand(100);
  69.                 a[i] = r % 101; //* ( r % 2 ? 1 : -1);
  70.         }
  71. }

  72. int
  73. main()
  74. {
  75.         int n = 3;
  76.         int a[] = {999, 1, 0};
  77.         int b[] = {1, 0, 2};

  78.         do_swap(a, b, n);
  79.         dump_array(a, n);
  80.         dump_array(b, n);

  81.         int n2 = 4;
  82.         int a2[] = {1, 2, 3, 4};
  83.         int b2[] = {5, 6, 7, 8};

  84.         do_swap(a2, b2, n2);
  85.         dump_array(a2, n2);
  86.         dump_array(b2, n2);

  87.         int n3 = 5;
  88.         int a3[n3], b3[n3];
  89.         mk_rand_int_array(a3, n3);
  90.         mk_rand_int_array(b3, n3);

  91.         do_swap(a3, b3, n3);
  92.         dump_array(a3, n3);
  93.         dump_array(b3, n3);

  94.         exit(0);
  95. }
复制代码

论坛徽章:
0
407 [报告]
发表于 2013-09-25 22:02 |只看该作者
这个题目,如果只是达到结果,那可以创造一个 2N 的数组C, 把数组A B 的元素都放到C里面,
对数组C排序, 再把C的前N个放到A, 后N个放到B。
这样比较简单吧,比起A和B之间互换元素要方便,就是多占用了内存。

论坛徽章:
0
408 [报告]
发表于 2013-11-05 17:19 |只看该作者
放到一个临时数组里排序后,两头取,分别存在a,b里


如果存在这样一个数,它比所有的数加起来都要大的多,这个就不能实现了吧。

论坛徽章:
0
409 [报告]
发表于 2013-12-30 19:09 |只看该作者
根据21楼同学的思路写的代码,我认为思路是对的
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. void swap(int *a,int *b)
  4. {
  5.   int temp = 0;
  6.       temp = *a;
  7.       *a = *b;
  8.       *b = temp;
  9. }

  10. void sort(int *a,int *b,int *c,int n)
  11. {
  12.   int i = 0,j = 0,temp = 0;

  13.   for( i = 0; i < 2*n; i++)
  14.   {
  15.     if(i < n) {
  16.       c[i] = a[i];
  17.     }else{
  18.       c[i] = b[j];
  19.       j++;
  20.     }
  21.   }

  22.   for(j = 0; j < 2*n-1; j++)
  23.     for(i = 0; i < 2*n -j-1 ; i++)
  24.          if(c[i] < c[i+1]) {swap(&c[i],&c[i+1]);}
  25. }

  26. void array_lleast(int *a,int *b,int n)
  27. {
  28.   int i = 0, asum = 0,bsum = 0,acount = 0,bcount = 0;
  29.   int *c =  (int *)malloc(2*n*sizeof(int));

  30.   sort(a,b,c,n);
  31.   while((acount < n) && (bcount < n))
  32.   {
  33.     if(asum <= bsum) {
  34.       a[acount] = c[acount+bcount];
  35.       asum += a[acount];
  36.       acount++;
  37.     }else{
  38.       b[bcount] = c[acount+bcount];
  39.       bsum += b[bcount];
  40.       bcount++;
  41.     }
  42.   }

  43.   if(acount >= n){
  44.     for(i = bcount; i < n; i++)
  45.            b[i] = c[n+i];
  46.   }else{
  47.         for(i = acount; i < n; i++)
  48.            a[i] = c[n+i];
  49.   }
  50. }


  51. int main()
  52. {
  53.   int a[] = { 26, 25, 18, 36, 18, 48, 19, 51};
  54.   int b[] = {12,12,13,11,85,14,94,13};
  55.   int i = 0,sum = 0;

  56.   array_lleast(a,b,8);
  57.   
  58.   for(i = 0; i < 8; i++)
  59.     sum += a[i]-b[i];

  60.   if(sum < 0) sum = -sum;
  61.   printf("%d ",sum);
  62. return 0;
复制代码

论坛徽章:
0
410 [报告]
发表于 2013-12-30 20:24 |只看该作者
有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。

既然说明了是可以交换a,b中的元素,而且a,b元素都是n,那么只要再申明一个临时数组c,其中存放a,b中的元素,对其进行排序,然后将c中相邻元素相减(diff+=c[i+1]-c[i];i+=2;//这里是从小到大排序),最后得到的diff就是最小差之和了。

举例说明  如果a中含1,3,5  b中含2,4,6   在这样的情况下貌似2楼的方法可行,但是如果换成a:1,2,3   b:4,5,6   这样就不行,而把a,b中的元素放到同一个数组里面就不会出现这种情况。

楼上所提让我类似的想到快速排序法的数轴。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP