免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
391 [报告]
发表于 2013-06-20 11:35 |只看该作者
这出题目的人是垃圾, 就因为条件和问题交待的不清楚, 便可断定.

论坛徽章:
0
392 [报告]
发表于 2013-06-23 19:07 |只看该作者
基本可以这样:
先算出a元素的和与数组b元素的和之间的差,设为sumX
再进行一一交换使,并求出新的差,设为tota
若abs(sumX)>abs(tota),使sumX=tota
否则换回来……
最后输出最终的sumX
函数代码如下:
/*需要math.h、iostream.h*/
void change(int *a,int *b,int n)
{
        int tota,tmp;
        int sumX=sum(b,n)-sum(a,n);//sum()用于计算数组之和,参数为数组名和大小
        for(int j=0;j<n;j++)
        {
                for(int i=0;i<n;i++)
                {
                        tmp=a[i];
                        a[i]=b[j];
                        b[j]=tmp;
                        tota=sum(b,n)-sum(a,n);
                        if(abs(tota)<abs(sumX))
                        {
                                sumX=tota;
                        }
                        else
                        {
                        tmp=a[i];
                        a[i]=b[j];
                        b[j]=tmp;
                       
                        }
                }
        }
        putout(a,n);//putout()用于打印数组,参数为数组名和大小
        putout(b,n);
        cout<<sumX <<endl;
}

论坛徽章:
0
393 [报告]
发表于 2013-06-23 22:37 |只看该作者
我认为不应该从小的先取,应该先处理两个最大的,因为两个最大的不可能在一个数组中,但两个最小的可能在同一个数组中。回复 45# ccjjhua


   

论坛徽章:
0
394 [报告]
发表于 2013-06-23 22:45 |只看该作者
同意你的看法,考虑负数,排序的方法都行不通,效率方面还可以优化。回复 390# 被你发现了


   

论坛徽章:
0
395 [报告]
发表于 2013-06-25 14:31 |只看该作者
回复 1# forrestgang


#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int sort(int *x, int num)
{
    int i, j, tmp;
    for(i = 0; i < num; i++)
    {
        for(j = i; j < num; j++)
        {
            if(x < x[j])
            {
                tmp = x;
                x = x[j];
                x[j] = tmp;
            }
        }
    }
    return 0;
}
int main(void)
{
    int c[10];
    int j;
    int sum_a = 0;
    int sum_b = 0;
    int a[5] = {23,4,6,58,45};
    int b[5] = {51,12,3,43,46};
    // 结合两个数组  
    for (j = 0; j < 5; j++)
    {
        c[ 0 * 5 + j ] = a[j];
        c[ 1 * 5 + j ] = b[j];
    }
    // 从大到小排列
    sort(c,10);
    // 交叉取数
    for(j = 0; j < 5; j++)
    {
        if(sum_a >= sum_b)
        {
            a[j] = c[j*2 + 1];
            b[j] = c[j*2];
            sum_a += c[j*2 + 1];
            sum_b += c[j*2];
        }else{
            b[j] = c[j*2 + 1];
            a[j] = c[j*2];
            sum_b += c[j*2 + 1];
            sum_a += c[j*2];
        }
    }
    for(j = 0; j < 5; j++)
    {
        printf(" %d ", a[j]);
    }
    printf("\n");
    for(j = 0; j < 5; j++)
    {
        printf(" %d ", b[j]);
    }
    printf("\n");
    printf("sum_a = %d\n", sum_a);
    printf("sum_b = %d\n", sum_b);
    return 0;
}

论坛徽章:
0
396 [报告]
发表于 2013-06-27 17:15 |只看该作者
13楼正解
                             

论坛徽章:
0
397 [报告]
发表于 2013-06-29 13:29 |只看该作者
目测要用到动态规划分析最优子结构

论坛徽章:
0
398 [报告]
发表于 2013-07-07 17:09 |只看该作者
#define EXCHANGED    1
#define UNEXCHANGE  0

/* 交换两个数组的元素,如果交换后能使两数组各自的和之间差变小,则交换,否则不交换 */
int ExchangeEle( int* array1, int index1, int* array2, int index2, int size )
{   
    int sum1 = 0, sum2 = 0;
    int distance1 = 0, distance2 = 0;
    int iTemp = 0;
    int i = 0;
   
    for( i = 0; i < size; i ++ )
    {
        if( i != index1 )
            sum1 += *( array1 + i );
        if( i != index2 )
            sum2 += *( array2 + i );
    }
    distance1 = abs( ( sum1 + array1[index1] ) - ( sum2 + array2[index2] ) );
    distance2 = abs( ( sum1 + array2[index2] ) - ( sum2 + array1[index1] ) );
   
    if( distance2 < distance1 )
    {
        iTemp = *( array1 + index1 );
        *( array1 + index1 ) = *( array2 + index2 );
        *(array2 + index2 ) = iTemp;
        return EXCHANGED;
    }
    return UNEXCHANGE;
};

void Func( int* array1, int* array2, int size )
{
    int i = 0, j = 0;
    int iFlag = 0;
    for( i = 0; i < size; i ++ )
    {
        iFlag = 0;
        for( j = 0; j < size; j ++ )
        {
            if( ExchangeEle(array1, i, array2, j, size ) == EXCHANGED )
            {
                iFlag = 1;
            }
        }
        if( iFlag == 1 )
            break;
    }
    /* 两个数组有交换过元素,已经是两个新数组了,继续处理新数组 */
    if( iFlag == 1 )
    {
        Func( array1, array2, size );
    }
};

论坛徽章:
0
399 [报告]
发表于 2013-07-12 10:27 |只看该作者
本帖最后由 801901987 于 2013-07-13 09:56 编辑

交叉互换相加比较~

  1. #include <iostream>

  2. int main(void)
  3. {
  4.     int a[8] = {0, 0, 0, 0, 1, 100, 0, 0};
  5.     int b[8] = {0, 0, 2, 4, 6, 8, 0, 0};
  6.     int i,j=0,k=0,l,temp,m;   
  7.     for(i=0;i<8;i++)
  8.     j+=a[i]-b[i];
  9.     if(j<0)
  10.     j-=j*2;
  11.     for(i=0;i<8;i++)
  12.     {
  13.          for(l=0;l<8;l++)
  14.     {
  15.              temp=b[l];
  16.              b[l]=a[i];
  17.              a[i]=temp;      
  18.                for(m=0;m<8;m++)
  19.                    k+=a[m]-b[m];     
  20.                     if(k<0)
  21.                     k-=k*2;
  22.                     if(k>=j)
  23.                     {
  24.                     a[i]=b[l];               
  25.                     b[l]=temp;      
  26.                      
  27.                            
  28.                     }
  29.                     else
  30.                     j=k;
  31.                     k=0;            
  32.                     }            
  33.                     
  34.                     
  35.                     
  36.                     }
  37.                     for(i=0;i<8;i++)
  38.                     printf("%-4d",a[i]);
  39.                      printf("\n");
  40.                     for(i=0;i<8;i++)
  41.                     printf("%-4d",b[i]);
  42.                     printf("\n");               
  43.     printf("%d\n",j);
  44.     system("pause");
  45.     return 0;
  46. }
复制代码

论坛徽章:
0
400 [报告]
发表于 2013-07-12 11:12 |只看该作者
思路:
1.先算出a元素的与数组b元素的总和,然后求平均数avr。
2.分别算出a,b两数组的总和与平均数avr的差值d。
3.分别将a,b数组中与d差值最小的元素找出,然后分别替换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP