统计数组中重复的元素(简易版统计单词频率,有图有真相)

s1070 2015-02-09 08:48:40
题目:
有101个正整数,包含了1到100间的所有正整数,其中有一个数重复,设计算法,查重此重复数,并返回它。
int receptionist(int numbers【】);

问题
1,简要叙述,算法思路
2,给出实现





...全文
525 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
flexman09 2015-03-06
  • 打赏
  • 举报
回复
应该是int *end=numbers +100吧?
引用 3 楼 fly_dragon_fly 的回复:
1 . 直接加起来减去5050(1+..100) 2.

int receptionist(int numbers[])
{
     int s=0;
     int *end=numbers +101;
     while(numbers!=end)
           s +=*numbers++;
     return s-5050;
}
BrillianceRen 2015-02-13
  • 打赏
  • 举报
回复
唉妈, 怎么老写秃噜....

int fun(int* nums, int count)
{
  map<int, int> m;
  for(int n = 0; n < count; n++)
  {
    auto ret = m.insert(std::pair<int,int>(nums[n], nums[n]));
    if(ret.second == false)
      return ret.first->second;
  }
  return 0;
}
Zip Zou 2015-02-13
  • 打赏
  • 举报
回复
求和减去1-100的和
SEESEECN 2015-02-13
  • 打赏
  • 举报
回复
直接求和减去5050
mymtom 2015-02-12
  • 打赏
  • 举报
回复
由于数的范围是100,计数会比较简单

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100

int
receptionist(int numbers[])
{
    int i;
    int count[N] = {0};

    for (i = 0; i < N + 1; i++)
    {
        if (count[numbers[i]]++)
        {
            return numbers[i];
        }
    }

    return 0;
}

int
main(int argc, char *argv[])
{
    int i, j;
    int numbers[N + 1];
    int pos, num;

    srand(time(NULL));

    pos = rand() % 101;
    num = rand() % 100 + 1;

    numbers[pos] = num;
    j = 1;
    for (i = 0; i < N + 1; i++)
    {
        if (i != pos)
        {
            numbers[i] = j++;
        }
    }

    for (i = 0; i < N + 1; i++)
    {
        printf("%3d ", numbers[i]);
        if (i % 10 == 9)
        {
            printf("\n");
        }
            
    }
    printf("\n=======================================\n");

    printf("%d\n", receptionist(numbers));
    return 0;
}
姚自新 2015-02-10
  • 打赏
  • 举报
回复
方法一:将101个正整数相加,再减去“1到100的和”。 方法二:遍历101个正整数,用一个位序列记录某个数是否出现过。 方法一要作固定次数的加法运算和一次减法运算,方法二可能会提前发现重复数。
fly_dragon_fly 2015-02-10
  • 打赏
  • 举报
回复
1 . 直接加起来减去5050(1+..100) 2.

int receptionist(int numbers[])
{
     int s=0;
     int *end=numbers +101;
     while(numbers!=end)
           s +=*numbers++;
     return s-5050;
}
ri_aje 2015-02-10
  • 打赏
  • 举报
回复
全加起来减去 n*(n+1)/2 就行了吧,n==100.
jiht594 2015-02-09
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <windows.h>
#include <ctime>

//计算的原理
//(101个数字的和)-(1至100的和)==重复的那个数


int receptionist(int numbers[])
{
    int sum101 = 0;
    for (int i = 0; i < 101; ++i)
    {
        sum101 += numbers[i];
    }

    //自然数前n项[0-n]和公式n*(n-1)/2
    //前101项和[0-100]
    int sum100 = 101*(101 - 1)/2;

    return sum101 -sum100;
}
int main()
{
    //初始化101个数
    int arr[101] = {0};
    for (int i = 0; i < 100; ++i)
    {
        arr[i] = i + 1;
    }
    srand(unsigned(time(0)));
    arr[100] = (rand() % 99) + 1;//这个是重复的数

    //计算
    printf("实际重复的是 %d\n", arr[100]);
    printf("计算重复的是 %d\n", receptionist(arr));
    system("pause");
}

likfeng 2015-02-09
  • 打赏
  • 举报
回复
//不考虑空间复杂度的话 int receptionist(int numbers[]) { int N[101]; for(int a = 0; a < 101; a++) { N[a] = 0; } for(int i = 0; i < 101; i++) if(N[numbers[i]] > 0) { return numbers[i]; } else { N[numbers[i]]++; } return 0; }

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧