免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
461 [报告]
发表于 2015-07-27 20:48 |只看该作者
没经过ACM训练的,就算了吧。 8分钟写动态规划。

论坛徽章:
0
462 [报告]
发表于 2015-08-23 01:23 |只看该作者
本帖最后由 davetys 于 2015-08-23 01:33 编辑

1.设一个数组C,把数组A和B都包含到里面,对C进行排序
2.让SUMA=A[0]=C[2n-1],SUMB=B[0]=C[2n-2], SUMA和SUMB分别是A和B的当前和
3.C倒序轮流给A和B赋值,如果SUMA大于等于SUMB,把C中较大的那个赋给B,然后接下来的就符给A,如果SUMA小于SUMB,则相反,然后SUMA和SUMB加上当前的A和B
4.如此往复,应该是最小的差距了

此算法是C倒序赋值给A和B,不是顺序赋值

伪代码:

sort(C, 2n);
SUMA=A[0]=C[2n-1];
SUMB=B[0]=C[2n-2];
for(i=1,i<n;i++)
{
    if(SUMA<SUMB)
    {
        A[ i ] = C[2(n-i)-1];
        B[ i ] = C[2(n-i)-2];
        SUMA += A[ i ];
        SUMB += B[ i ];
    }
    else
    {
        A[ i ] = C[2(n-i)-2];
        B[ i ] = C[2(n-i)-1];
        SUMA += A[ i ];
        SUMB += B[ i ];
    }
}

论坛徽章:
0
463 [报告]
发表于 2015-09-14 18:14 |只看该作者
本帖最后由 xyl5565 于 2015-09-14 18:16 编辑

终于搞定 bug害人

//不知道n
//条件
import console
数组1={}
数组2={}
n=console.getNumber( "请输入每个数组元素个数: " )
for(i=1;n;1)
{
        table.push(数组1,console.getNumber( "请输入数组1的第"+i+"个元素:" ))
}
for(i=1;n;1)
{
        table.push(数组2,console.getNumber( "请输入数组2的第"+i+"个元素:" ))
}


//功能函数
getsum=function(ts)
{
if(not #ts)
{
        return 0;
}
        sum=0
        for(k,v in ts)
        {
                sum+=v       
        }
        return sum;
}

s3=table.concat(数组1,数组2)
table.sort(s3)
数组1={}
数组2={}
while(#s3>0)//有数字就继续取
{
sum2=getsum(数组2)
sum1=getsum(数组1)
t1=数组1
t2=数组2
        if(sum2>sum1)
        {
                t1=数组2
                t2=数组1
        }
        n=table.pop(s3,1)
        table.push(t2,n)
        sum2=getsum(t2)
        sum1=getsum(t1)
        for(i=1;#s3;1)
        {
                if((sum1+s3)>=sum2)
                {
                                l=i
                                break ;
                }
                l=i
        }
                table.push(t1,s3[l])
                table.remove(s3,l)               
}

console.log('数组:')
console.log(table.tostring(数组1))
console.log(table.tostring(数组2))
console.log('和为:')
console.log(getsum(数组1))
console.log(',')
console.log(getsum(数组2))
execute("pause")

论坛徽章:
0
464 [报告]
发表于 2015-09-14 18:24 |只看该作者
程序 计算.rar (283.51 KB, 下载次数: 1)

论坛徽章:
0
465 [报告]
发表于 2015-11-18 14:19 |只看该作者
确实挺容易进误区的

论坛徽章:
0
466 [报告]
发表于 2016-04-04 15:07 |只看该作者
本帖最后由 amduroncn 于 2016-04-04 15:16 编辑

有点难了.

论坛徽章:
0
467 [报告]
发表于 2016-04-07 15:02 |只看该作者
开第三个数组,a,和b 放进去,排序,大端的全放b,小端全放a. a的和 - b的和就是最大负数。不就是最小值吗?讨论那么久

论坛徽章:
0
468 [报告]
发表于 2016-04-08 15:22 |只看该作者
//伪代码:
    int a[]={1,23,,3435,354,67,};
    int b[]={3,342,123,1,5412,123,};
    int c[] = a+b;
    sort(c);
    for(int i =0; i< len(c); i++)
    {
        if (i%2==0)
        {
            a[i/2] =c[i];
        }else{
            b[i/2] =c[i];
        }
    }
icquu 该用户已被删除
469 [报告]
发表于 2016-05-18 17:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
470 [报告]
发表于 2016-06-12 14:43 |只看该作者
感觉挺简单啊,这么长时间还有回复。1算出俩个数组和 的差值 2.将差值除以2(每次交换差值会缩小2倍)3.找到小于差值的最近的交换。
例如 a {1 2 3 4 } b{6 7 8 9}
一、suma =10 sumb=30   (sumb-suma)/2 =10
9 -1 =8 <10 交换 a{9 2 3 4} b{6 7 8 1}
二、suma =18 sumb=22   (sumb-suma)/2 =2
8 最小差4 ;7最小差3 ;6最小差2
正好交换6 和4 即可
a{9 2 3 6} b{4 7 8 1}
三、 suma = sumb =20
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP