免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2781 | 回复: 7
打印 上一主题 下一主题

那个8分钟的华为面试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 15:51 |只看该作者 |倒序浏览
10可用积分
这些天华为那个使两个数组差最小的题,让我很郁闷,自己钻了牛角尖,总想找个快速有效的算法,最终发现没有。看了一下别人的代码发现这个问题直接置换就行,其实自己也想过这个算法但是没有仔细想,总感觉应该有更有效的算法,自己还要修炼啊,做到论语里的“耳顺”啊。
下面是我把网友的代码整理后修改得到的,比较简洁,而且style也好了不少。希望大家写代码能超过我的code style,哈哈。

#include <cmath>

void EqualizeArray( int * A, int * B, int count )
{
    int sum_A = 0;
    for ( int m = 0; m < count; m++ )
        sum_A += A[m];  
   
    int sum_B = 0;
    for ( int n = 0; n < count; n++)
        sum_B += B[n];     

    int diff_AB = sum_A - sum_B;

    for ( int i = 0; diff_AB && i < count; i++ )
    {
        for ( int j = 0; diff_AB && j < count; j++ )
        {
            int diff = A - B[j];
            if (  abs( diff_AB - 2 * diff ) < abs( diff_AB ) )
            {   
                int tmp = A;
                A = B[j];
                B[j] = tmp;
                diff_AB -= 2 * diff;
            }
        }
    }
}

int main( int argc, char *argv[] )
{
    int A[3] = { 9, 8, 7 };
    int B[3] = { 5, 4, 3 };

    EqualizeArray( A, B, 3 );

    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-07-16 16:13 |只看该作者
不知道事先对数组排序再交换如何。。。

论坛徽章:
0
3 [报告]
发表于 2008-07-16 16:15 |只看该作者
LZ 是很无聊,,

论坛徽章:
0
4 [报告]
发表于 2008-07-16 16:17 |只看该作者
楼上才无聊

论坛徽章:
0
5 [报告]
发表于 2008-07-16 16:18 |只看该作者
原帖由 runforu 于 2008-7-16 15:51 发表
这些天华为那个使两个数组差最小的题,让我很郁闷,自己钻了牛角尖,总想找个快速有效的算法,最终发现没有。看了一下别人的代码发现这个问题直接置换就行,其实自己也想过这个算法但是没有仔细想,总感觉应该有 ...


算法描述和证明在哪里?

论坛徽章:
0
6 [报告]
发表于 2008-07-16 16:19 |只看该作者
原帖由 silverzi 于 2008-7-16 16:17 发表
楼上才无聊utu:" />


论坛徽章:
0
7 [报告]
发表于 2008-07-16 16:28 |只看该作者
CSDN上有一个动态规划的解法,说是用反证法可证,但没有具体证明过程,现在正在研究。

论坛徽章:
1
摩羯座
日期:2014-12-04 12:25:23
8 [报告]
发表于 2012-06-04 22:06 |只看该作者
runforu 发表于 2008-07-16 15:51
这些天华为那个使两个数组差最小的题,让我很郁闷,自己钻了牛角尖,总想找个快速有效的算法,最终发现没有 ...



楼主的答案很好,我看代码看懂了。通过代码我看到你的解题方法。

最后一个问题是判断答案的正确性:
做一个嵌套for循环,for(int i = 0; i < n; i++) { for (int j=0; j < n; j++ ) { ... }} 不存在一个a b[j]使得 | sum(a) - sum(b) | 更小。

现在问题是EqualizeArray迭代完成了以后,怎么能保证上面这个判断成立(因为没有执行最后这一个循环判断)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP