快速业务通道

google竞赛题SecretSum的C++解法

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
值也就确定了。所以3个数中,我们先确定2个数(假设先确定num1,num2),然后用这两个数的和就可以确定第3个数(result)了。这样最笨的方法就是把num1和num2代表的数分别从100-999取一遍。这需要判断900*900=810,000种组合。显然这么筛选效率太低,还可以优化。进一步分析,我们可以发现既然result的最大值可取到999,那么当num1=100时,num2最大值为999-100=899;当num1=400时,num2的最大值为999-400=599.也就是说当num1 = i时,num2的最大值为999-i。这样当num1确定时假设为i,则num2的范围为[100,999-i]。当num2取得最小值100时,num1可以取得最大值999-100=899。所以num1的取值范围为[100,899]。这样遍历num1和num2可取的值的代码如下所示:

int i,j,count=0;
    for ( i = 100; i<=899; i++)
    {
      for ( j = 100; j <= 999-i; j++)
      {
        if ( 匹配成功)
        {
          count++;
        }
      }
}

这么一来需要判断的组合数量变成 800+799+......+1 =320400(种) 比原先减少了近一半。但数量依旧庞大。

继续省题,我从"ABA"不可以代表555的说明中得到提示:在得到一个三位数时,就可以根据不同字母取不同的值来筛掉一批不符合要求的数。怎么实现这种比较呢?我是这么做的,将一个三位数(或字符串)中每一位置的数(或字母)与其他位置的数(或字母)比较,记下比较的结果保存在一个整型数组中,1表示比较结果相同,0表示不相同。还好字符串才3个字母,各个位置的比较总共才三次,分别为(0,1),(0,2),(2,1),例如在"ABA"的比较中:0位置的A和1位置的B比较,显然不等结果为0;0位置的A和2位置的A比较,相等结果为1;1位置的B和2位置的A比较,结果不等为0.结果可以用一个大小为3的数组保存."ABA"的比较结果为{0,1,0};同样的方法来计算929的比较结果为{0,1,0};和"ABA"结果相同,所以"ABA"可以代表929.而555比较结果为{1,1,1},所以"ABA"不可能代表555.由于传入的字符串有3个,我们可以使用3*3大小来保存这个结果.在类中我用int m_linePattern[3][3];这个成员变量来表示.在循环筛选前,应该先把传入的字符串匹配类型计算出来.我添加了成员函数void init(string **pStr)来完成此工作.代码如下:

void init(string **pStr)
  {
    int i,j;
    memset(m_linePattern,0,sizeof(m_linePattern));
    for ( i = 0 ; i< 3; i++)
    {
      char ch[3];
      for ( j = 0; j<3; j++)
      {
        ch[j] = (*pStr[i])[j];
      }
      if ( ch[0]==ch[1]) m_linePattern[i][0]=1;//比较0,1位置
      if ( ch[0]==ch[2]) m_linePattern[i][1]=1;//比较0,2位置
      if ( ch[1]==ch[2]) m_linePattern[i][2]=1;//比较1,2位置
    }
  }

我又添加了成员函数int IfNumOk(int idx, int num)来比较num是否符合索引为idx的字符串.匹配成功返回1,失败返回0.代码如下:

int IfNumOk(int idx, int num)
  {
    char temp[4];
    int com[3]={0};
    sprintf(temp,"%d",num);//将num转换成字符串
    //计算传入数字的匹配结果
    if (temp[0] == temp[1] ) com[0]=1;
    if (temp[0] == temp[2] ) com[1]=1;
    if (temp[2] == temp[1] ) com[2]=1;
    //与索引为idx的字符串匹配结果比较
    for ( int i=0; i< 3; i++)
      if ( com[i] != m_linePattern[idx][i]) return 0;
    return 1;
  }

这样同时通过了IfNumOk筛选的数字

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号