编程之美 代码 P125 2.3寻找发帖水王

开始想的是最简单的两种思路:

1.遍历,统计每个ID出现的次数;

2.排序,然后再统计;


看过书后算法,感觉很好。求解的代码,也花了较长时间看懂;没看代码前,自己是用递归写的。


代码如下:


#include 
#include 
using namespace std;
string solute(vector vec);
string solute2(vector vec);
int main()
{
    vector myStrVec;

    myStrVec.push_back("1");
    myStrVec.push_back("1");
    myStrVec.push_back("1");
    myStrVec.push_back("2");
    myStrVec.push_back("3");
    myStrVec.push_back("4");
    myStrVec.push_back("5");
    myStrVec.push_back("2");
    myStrVec.push_back("2");
    myStrVec.push_back("2");
//    string str;
//    while(cin >> str){
//        myStrVec.push_back(str);
//
//    }

    cout << solute(myStrVec) << endl;
    cout << solute2(myStrVec) << endl;

    return 0;
}
//递归解法
string solute(vector vec)
{
    int i;
    for(i=1 ; i vec)
{
    int i,ntimes = 0;
    string candidate;

    for(i=0 ; i

作者中代码,candidate表示当前匹配对象,ntimes为其出现的次数,每次为零时,更换candidate为i指示的元素。如果candidate与vec.at(i)相等,说明两者为同一ID,ntimes++;反之,ntimes--;


扩展问题,类似原题,好容易想到。每次去掉四个不同元素,最后剩下的三种必为所求。

代码如下:

//递归解法
vector solute(vector vec)
{
    int i,j;
    vector myIndex;
    myIndex.push_back(0);
    for(i=1 ; i=0 ; k--){//bug
                    vec.erase(vec.begin() + myIndex.at(k));
                }

                vector back = solute(vec);
                return back;
            }
        }


    }
    return vec;//所有元素相同
}




总结:这要考察大规模字符串统计问题。传统的排序后统计浪费时间,直接统计再找最大的浪费空间。不得不说作者的想法(每次去掉两个不同的元素,不会影响最后的结果)很巧妙。

另外,如果排好序后找出现次数超过一半的元素,直接取中间位置的元素,很牛X。不过有限制,大多时候还是看出现最多的,不一定超过一半,不具一般性,只能说是一种思路,可以学习。

你可能感兴趣的:(编程之美,算法)