免费注册 查看新帖 |

Chinaunix

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

[算法] 华为面试题,求答案? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-15 12:31 |只看该作者 |倒序浏览
从键盘输入8个数字如:1,2,3,4,5,6,7,8;
根据这8个数字完成任意几个的组合和;
如:
1+2,1+3,1+4,1+5,1+6,1+7,1+8;
1+2+3,1+2+4,1+2+5,.....;
1+2+3+4,1+2+3+5,...
1+2+3+4+5,1+2+3+4+6,....
2+3,2+4....
2+3+4,2+3+5..



有谁能解?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2014-08-15 12:52 |只看该作者
动态规划 + hash滤重,复杂度2^N, 目前没更好的算法

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
3 [报告]
发表于 2014-08-15 12:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
4 [报告]
发表于 2014-08-15 13:01 |只看该作者
回复 2# koolcoy

复杂度O(2^N)没跑啊,结果的个数就是2^N-N-1个,复杂度没法更低了。

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
5 [报告]
发表于 2014-08-15 13:29 |只看该作者
智商太低,没看懂。。。。捂脸泪奔

论坛徽章:
0
6 [报告]
发表于 2014-08-15 13:33 |只看该作者
就是8个数值当中,随便取几个来加起来。求代码

论坛徽章:
0
7 [报告]
发表于 2014-08-15 14:25 |只看该作者
全部的组合打出来倒很容易,可是万一有两个输入一样怎么办呢?简单算法好像照不住。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
8 [报告]
发表于 2014-08-15 14:28 |只看该作者
每个数字只有两个状态,分别是『选中』和『不选中』,因此只有 2^8 个组合
假如 共选择0个 和 共选择1个 的情况,那也只有 2^8 -1 - 8 个组合
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     const unsigned N = 8;

  5.     for( unsigned i=1; i!=(1u<<N); ++i ) // i不从0开始,是为了剔除『一个都没选择』的情况
  6.     {
  7.         if( (i&(i-1)) == 0 ) // 剔除『只选择了一个』的情况
  8.             continue;

  9.         // 输出
  10.         for( unsigned j=0; j!=N; ++j )
  11.             if( i&(1u<<j) )
  12.                 printf( "%d+", j+1 );
  13.         printf( "\n" );
  14.     }

  15.     return 0;
  16. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-08-15 14:43 |只看该作者
本帖最后由 udb6688 于 2014-08-15 14:49 编辑

回复 8# bruceteen


   太牛了,暂时不能理解,能不能代码写全,如果从键盘输入,43,72,12,32,19,9,2,14这8个数字,求打印出所有结果

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2014-08-15 14:49 |只看该作者

  1. #include <stdio.h>

  2. int main() {
  3.         int input[8] = {1,2,3,4,5,6,7,8};
  4.         int sum[256];

  5.         sum[0] = 0;
  6.         sum[1] = input[0];

  7.         int idx = 2;
  8.         for (int i = 1; i < 8; ++i, idx *= 2) {
  9.                 for (int j = 0; j < idx; ++j) {
  10.                         sum[idx + j] = input[i] + sum[j];
  11.                 }
  12.         }
  13.         for (int i = 0; i < 256; ++i) {
  14.                 printf("%d ", sum[i]);
  15.         }
  16.         return 0;
  17. }
复制代码
DP差不多就这个意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP