求数组中反复次数最多的元素

1.问题描写叙述

  比如:数组a={2,3,1,5,5,5,5,7,8,1}。元素2、3、7、8各出现1次。1出现两次。5出现4次,则反复次数最多的元素为5.


2. 方法与思路

2.1 以空间换时间,索引法

  定义一个数组int cnt[MAX],将其元素所有初始化为0。然后遍历数组a。运行cnt[a[i]]++操作。最后在cnt数组中找最大的数。相应的数即为反复次数最多的数。


  代码示比例如以下:
  

//以空间换时间,索引法
int MaxFreq_index(int a[],int n)
{
    int i,j;
    int max = a[0];

    //求出最大值,以分配计数数组空间
    for(i = 1; i < n; i++)
        if(a[i] > max)
            max = a[i];

    int *cnt = new int[max];

    for(i =0; i < max; i++) cnt[i]=0;


    max = 0;
    for(i = 0; i < n; i++)
    {

        if( ++cnt[a[i]] >= cnt[max] )
        {
            max= a[i];
        }
    }

    return max;
}

2.2 map映射法

  使用map键值对来记录元素的出现次数。键为元素。值为键相应出现的次数。

时间复杂度为o(n)。

#include <map>
...

int MaxFreq_map(int a[],int n)
{
    map<int,int> mp;
    int i,maxfreqNum=0;

    for(i = 0; i < n; i++)
        if( ++mp[a[i]] >= mp[0] )
            maxfreqNum = a[i];

    return maxfreqNum;
}

转载于:https://www.cnblogs.com/mfmdaoyou/p/6946622.html

### 回答1: 好的,以下是使用折半查找法实现的程序。我会在程序中添加注释来解释每一步操作。 ```c #include <stdio.h> int main() { int arr[15] = {2, 3, 5, 7, 9, 11, 13, 14, 15, 16, 19, 20, 21, 23, 25}; // 给定的数组 int left = 0, right = 14, mid, num, count = 0; // 定义左右指针、中间值、要查找的数和查找次数 printf("请输入要查找的数:"); scanf("%d", &num); // 输入要查找的数 while (left <= right) { mid = (left + right) / 2; // 计算中间值 count++; // 记录查找次数 if (arr[mid] == num) { // 如果中间值等于要查找的数 printf("该数是第%d个元素的值\n", mid + 1); // 输出该数是数组中第几个元素的值 printf("查找了%d次\n", count); // 输出查找次数 return 0; // 结束程序 } else if (arr[mid] > num) { // 如果中间值大于要查找的数 right = mid - 1; // 将右指针移到中间值左侧 } else { // 如果中间值小于要查找的数 left = mid + 1; // 将左指针移到中间值右侧 } } printf("无此数\n"); // 如果程序能执行到这里,则说明要查找的数不在数组中 return 0; } ``` 这个程序可以实现连续查找。每次查找完毕后,程序会回到输入要查找的数的步骤,直到用户选择退出程序。 ### 回答2: 首先,我们需要将15个数存放在一个数组中。假设数组名为arr。 然后,通过scanf函数输入要查找的数,假设输入的数为target。 接下来,使用折半查找法找出该数在数组中的位置。折半查找法的基本思路是:首先将数组的中间位置的数与要查找的数进行比较,如果相等,则找到了要查找的数;如果不相等,则判断要查找的数是在中间数的左边还是右边,然后将数组的范围缩小一半,再进行比较,如此迭代直到找到要查找的数或者确定要查找的数不在数组中。 具体的算法如下: 1. 初始化变量low为数组的第一个位置,high为数组的最后一个位置。 2. 计算数组的中间位置mid = (low + high) / 2。 3. 判断要查找的数target与数组中间位置的数arr[mid]的关系: - 如果target等于arr[mid],则找到了要查找的数,输出mid+1,表示该数是数组中第(mid+1)个元素的值。 - 如果target小于arr[mid],则要查找的数在数组的左半部分,令high = mid-1,跳到步骤2。 - 如果target大于arr[mid],则要查找的数在数组的右半部分,令low = mid+1,跳到步骤2。 4. 如果low大于high,则说明要查找的数不在数组中,输出"无此数"。 这样就可以通过折半查找法找出要查找的数在数组中的位置了。 值得注意的是,为了实现连续查找,可以使用一个循环,反复输入要查找的数并进行查找。当要退出查找时,可以根据输入的条件设置一个退出循环的条件。 ### 回答3: 首先,我们先将15个数赋初值存放在一个数组中。然后通过scanf函数输入要查找的数。 下面是具体的步骤: 1. 定义一个包含15个元素的整型数组,用来存放这15个数。并且给数组赋初值。 ```c int arr[15] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29}; ``` 2. 使用scanf函数输入要查找的数。 ```c int target; printf("请输入要查找的数:"); scanf("%d", &target); ``` 3. 定义变量low和high分别表示数组的最低索引和最高索引。 ```c int low = 0; int high = 14; ``` 4. 使用while循环进行折半查找。循环条件是low <= high。 ```c while (low <= high) { int mid = (low + high) / 2; if (arr[mid] == target) { printf("要查找的数在数组中第%d个元素\n", mid + 1); break; } else if (arr[mid] < target) { low = mid + 1; } else { high = mid - 1; } } ``` 5. 在循环结束后,通过判断low是否大于high来确定要查找的数是否在数组中。如果low > high,则输出"无此数"。 ```c if (low > high) { printf("无此数\n"); } ``` 至此,根据输入的数,我们可以使用折半查找法在数组中找到该数是数组中第几个元素的值。如果该数不在数组中,会输出"无此数"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值