免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
11 [报告]
发表于 2014-08-15 14:55 |只看该作者
  1. #include <stdio.h>
  2. #include <assert.h>

  3. int main()
  4. {
  5.     const int arr[] = { 43, 72, 12, 32, 19, 9, 2, 14 };
  6.     const unsigned N = sizeof(arr)/sizeof(arr[0]);

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

  12.         // 输出
  13.         for( unsigned j=0; j!=N; ++j )
  14.             if( i&(1u<<j) )
  15.                 printf( "%d%c", arr[j], "+\n"[(i&((~0u)<<(j+1)))==0] );

  16.     }
  17.     return 0;
  18. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2014-08-15 14:58 |只看该作者
回复 10# koolcoy


    0 1 2 3 3 4 5 6 4 5 6 7 7 8 9 10 5 6 7 8 8 9 10 11 9 10 11 12 12 13 14 15 6 7 8 9 9 10 11 12 10 11 12 13 13 14 15 16 11 12 13 14 14 15 16 17 15 16 17 18 18 19 20 21 7 8 9 10 10 11 12 13 11 12 13 14 14 15 16 17 12 13 14 15 15 16 17 18 16 17 18 19 19 20 21 22 13 14 15 16 16 17 18 19 17 18 19 20 20 21 22 23 18 19 20 21 21 22 23 24 22 23 24 25 25 26 27 28 8 9 10 11 11 12 13 14 12 13 14 15 15 16 17 18 13 14 15 16 16 17 18 19 17 18 19 20 20 21 22 23 14 15 16 17 17 18 19 20 18 19 20 21 21 22 23 24 19 20 21 22 22 23 24 25 23 24 25 26 26 27 28 29 15 16 17 18 18 19 20 21 19 20 21 22 22 23 24 25 20 21 22 23 23 24 25 26 24 25 26 27 27 28 29 30 21 22 23 24 24 25 26 27 25 26 27 28 28 29 30 31 26 27 28 29 29 30 31 32 30 31 32 33 33 34 35 36
这样的结果似乎不对耶

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

基本就这么个意思,调试一下就能找到哪里不对了
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
14 [报告]
发表于 2014-08-15 15:11 |只看该作者
我那个代码应该没有错,这么改一下就很清晰了:

  1. #include <stdio.h>

  2. int main() {
  3.         unsigned long input[8] = {1, 10, 100, 1000, 10000, 100000, 1000000,
  4.                 10000000};
  5.         unsigned long sum[256];

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

  8.         int idx = 2;
  9.         for (int i = 1; i < 8; ++i, idx *= 2) {
  10.                 for (int j = 0; j < idx; ++j) {
  11.                         sum[idx + j] = input[i] + sum[j];
  12.                 }
  13.         }
  14.         for (int i = 0; i < 256; ++i) {
  15.                 printf("%08lu\n", sum[i]);
  16.         }
  17.         return 0;
  18. }
复制代码

论坛徽章:
0
15 [报告]
发表于 2014-08-15 15:15 |只看该作者
回复 14# koolcoy


    还没有细研究,发觉打印0,就认为不对了。

论坛徽章:
0
16 [报告]
发表于 2014-08-15 15:18 |只看该作者
回复 14# koolcoy


    idx=2是什么意思?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2014-08-15 15:21 |只看该作者
本帖最后由 koolcoy 于 2014-08-15 15:21 编辑

回复 16# udb6688

因为sum[0]和sum[1]已经赋值了,所以就从sum[2]开始算起
   

论坛徽章:
2
巳蛇
日期:2013-12-31 14:13:002015年亚洲杯之沙特阿拉伯
日期:2015-03-26 13:30:50
18 [报告]
发表于 2014-08-15 15:34 |只看该作者
这样吗?

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+6 1+2+7 1+2+8
1+2+3+4 1+2+3+5 1+2+3+6 1+2+3+7 1+2+3+8
1+2+3+4+5 1+2+3+4+6 1+2+3+4+7 1+2+3+4+8
1+2+3+4+5+6 1+2+3+4+5+7 1+2+3+4+5+8
1+2+3+4+5+6+7 1+2+3+4+5+6+8
1+2+3+4+5+6+7+8

2+3 2+4 2+5 2+6 2+7 2+8
2+3+4 2+3+5 2+3+6 2+3+7 2+3+8
2+3+4+5 2+3+4+6 2+3+4+7 2+3+4+8
2+3+4+5+6 2+3+4+5+7 2+3+4+5+8
2+3+4+5+6+7 2+3+4+5+6+8
2+3+4+5+6+7+8

3+4 3+5 3+6 3+7 3+8
3+4+5 3+4+6 3+4+7 3+4+8
3+4+5+6 3+4+5+7 3+4+5+8
3+4+5+6+7 3+4+5+6+8
3+4+5+6+7+8

4+5 4+6 4+7 4+8
4+5+6 4+5+7 4+5+8
4+5+6+7 4+5+6+8
4+5+6+7+8

5+6 5+7 5+8
5+6+7 5+6+8
5+6+7+8

6+7 6+8
6+7+8

7+8


   

论坛徽章:
0
19 [报告]
发表于 2014-08-15 15:38 |只看该作者
本帖最后由 sig13 于 2014-08-15 16:53 编辑

我用递归写了一个,但是也没有解决有重复输入的问题,即输入1,1,1,1这样的情况。
  1. #include <stdio.h>

  2. int b[16];

  3. int d(int in)
  4. {
  5.     static int cnt=0;
  6.     int i;

  7.     printf("%4d: ", cnt++);

  8.     if (in > 0) printf("%d", b[0]);

  9.     for (i=1; i<in; i++) printf("+%d", b[i]);

  10.     printf("\n");

  11.     return 0;
  12. }

  13. int p(int a[], int n, int m, int in);

  14. int p(int a[], int n, int m, int in)
  15. {
  16.     int i;

  17.     //printf("n=%d, m=%d, in=%d\n", n, m, in);

  18.     if (m < 0) return 0;
  19.     if (m == 0) return d(in);

  20.     if (m == n)
  21.     {
  22.         for(i=0; i<n; i++) b[in+i] = a[i];
  23.         return d(in+n);
  24.     }

  25.     for(i=0; i<n; i++)
  26.     {
  27.         b[in] = a[i];
  28.         p(a+(i+1), n-(i+1), m-1, in+1);
  29.     }

  30.     return 0;
  31. }

  32. int main(int argc, char* argv[])
  33. {
  34.     int a[]={1, 2, 3, 4, 5, 6, 7, 8};

  35.     p(a, 8, 2, 0);
  36.     p(a, 8, 3, 0);
  37.     p(a, 8, 4, 0);
  38.     p(a, 8, 5, 0);
  39.     p(a, 8, 6, 0);
  40.     p(a, 8, 7, 0);
  41.     p(a, 8, 8, 0);

  42.     return 0;
  43. }
复制代码

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
20 [报告]
发表于 2014-08-15 16:36 |只看该作者
#include<iostream>
#include<vector>
#include<string>  
#include<iterator>  
using namespace std;
using std::iterator;
void CombineRescure(vector<int> &num,vector<int>::iterator pNum,vector<int> &result,int count);
void Combine(vector<int> num,int n)
{
        if(num.empty())
                return;
        vector<int> result;
        CombineRescure(num,num.begin(),result,n);
}
void CombineRescure(vector<int> &num,vector<int>::iterator pNum,vector<int> &result,int count)
{
        if(count==0)
        {
                for(int i=0;i<result.size();i++)
                {
                        cout<<result[i];
                        if(i!=result.size()-1)
                                cout<<"+";
                }
                cout<<",";
                return;
        }
        if(pNum!=num.end())
        {
                result.push_back(*pNum);
                CombineRescure(num,pNum+1,result,count-1);
                result.erase(result.end()-1);
                CombineRescure(num,pNum+1,result,count);
        }
}
int main()
{
        vector<int> num;
        for(int i=1;i<=8;i++)
        {
                num.push_back(i);
        }

        for(int i=1;i<=num.size();i++)
        {
                Combine(num,i);
                cout<<endl;
        }
        return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP