看看谁效率高:找出给定数字,找出现次数文字串为:
1 2 3 5 4 3 2 5 5 7 3 2 4 5 2 3 22 12 19 15 1 2 3 5 4 3 29 15 22 12 19 15 1 2 3 ...
7 7 7 7 7 7 2 7 23 24 7 7 2 7 23 24 2 7 23 7 7 2 7 23...
5 1 7 5 2 3 22 12 13 2 5 2 3 22 12 13 2 ...
4 1 5 5 4 3 2 5 5 7 3 2 15 5 4 3 2 5 5 7 3...
给定数组要找的数字如: {2, 5, 3, 12}或 {3, 7, 9}等1. 计算出要找数字在给定字符串中(单行)共出现的次数。
2. 计算出要找数字在给哪行出现最多。(如{3, 7,9} 在第2行应该属出现最少,只有一个元素“7”出现)此贴Java, C++版各开一份,看看是不是常人所说的C++算法普强。
此分给算法最优的童鞋,大家在自己目前使用语言版发自己算法,和留下执行所耗时与CPU和内存多少。Java版贴
http://topic.csdn.net/u/20110731/20/813adbd5-7df5-4041-9f3a-f087d858f3ff.html

解决方案 »

  1.   

    要是我的话,就是建hash表,长度为每行中最大的数。
    以第一个为例:
    int num[] = {1, 2, 3, 5, 4, 3, 2, 5, 5, 7, 3, 2, 4, 5, 2, 3, 22, 12, 19, 15, 1, 2, 3, 5, 4, 3, 29, 15, 22, 12, 19, 15, 1, 2, 3}; // // 最大的数为:29,所以定义如下数组
    int a[30] = {0};int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    int num[] = {1, 2, 3, 5, 4, 3, 2, 5, 5, 7, 3, 2, 4, 5, 2, 3, 22, 12, 19, 15, 1, 2, 3, 5, 4, 3, 29, 15, 22, 12, 19, 15, 1, 2, 3}; //  int a[30] = {0}; int fnd[] = {2, 5, 3, 12};

    for(int i=0; i<sizeof(num)/sizeof(num[0]); i++)
    {
    ++a[num[i]];
    } for(int j=0; j<sizeof(fnd)/sizeof(fnd[0]); j++)
    {
    printf("%d : %d\n", fnd[j], a[fnd[j]]);
    } return 0;
    }
      

  2.   

    VisualEleven
    果然C++更生猛,回复都更快。
    上次有听个人论过更优法。期待完美楼下各种大师继续
      

  3.   

    凑个热闹,补个自己写的,欢迎指点...
    基于字符串,这样可以无视字符串长度和数字的位数了。#include "stdafx.h"
    #include <map>
    #include <string>
    using namespace std;int Split(char* lpString, const char* split, map<string, int> &tokenList)
    {
    char *token = strtok( lpString, split );
    while( token != NULL )
    {
    tokenList.insert( pair<string,int>(token,0) );
    token = strtok( NULL, split);
    }
    return (int)tokenList.size();
    }void Calculate(char* lpSrcString, const char* split, map<string, int> &destList)
    {
    char *token = strtok( lpSrcString, split );
    map<string, int>::iterator iter = destList.begin(), iterEnd = destList.end();
    while( token != NULL )
    {
    iter = destList.find(token);
    if (iter != iterEnd)
    iter->second++;
    token = strtok( NULL, split);
    }
    }int _tmain(int argc, _TCHAR* argv[])
    {
    char source[] = "1 2 3 5 4 3 2 5 5 7 3 2 4 5 2 3 22 12 19 15 1 2 3 5 4 3 29 15 22 12 19 15 1 2 3";
    char find[] = "2 5 3 12";
    map<string, int> dest;
    char* token = " ";
    Split(find, token, dest);
    Calculate(source, token, dest);
    map<string, int>::iterator iter = dest.begin(), iterEnd = dest.end();
    for (iter; iter != iterEnd; iter++)
    {
    printf("%s : %d \n", iter->first.c_str(), iter->second);
    }
    system("pause");
    return 0;
    }
      

  4.   

    Java版目前还没人回复,果然C版程序员优雅。有些人再争语言无关,C++工资与XX,我想这个贴的回复能给出些答案了。
      

  5.   

    数组arr. 下标=数字。  对应arr[数字]++; 统计完.over
      

  6.   


    那个,我打开你一楼JAVA的链接,似乎版面不对吧?
    看到的版面属性是“CSDN-CSDN社区-高性能开发-高性能WEB开发”
      

  7.   


    //C# 来凑个热闹
    void Main()
    {
     var num=new int[] {1, 2, 3, 5, 4, 3, 2, 5, 5, 7, 3, 2, 4, 5, 2, 3, 22, 12, 19, 15, 1, 2, 3, 5, 4, 3, 29, 15, 22, 12, 19, 15, 1, 2, 3};   var  fnd = new int[]{2, 5, 3, 12};

    var result=num.Where(n=>fnd.Contains(n)).Count();

    Console.WriteLine(result);
    }
      

  8.   

    2楼算法按数字显然较优的说但   int a[30] = {0};这个30问题,会有MAX问题。还有 假设是字符或字符串,就不太通用了。(不过题目只说了数字,哈哈)
    如果字符串,有没有更优化点的?
      

  9.   

    我想到的笨法只有在
        for(int i=0; i<sizeof(num)/sizeof(num[0]); i++)
        {
    改成类似,申明数组也改成相应的字符串。
         for(int j=0;j<fnd.length;j++)
         if(num[i]==fnd[j])){
         ++a[j];break;
         }else continue; 
        //-----最后的改。对字符串类似的有没有更好的优化:)
    //java版真是死水
    fnd[j], a[j]
      

  10.   

    fnd.length是java语法,我在java上调的