给你一个整型数组如{1,3,4,7,2,1,1,5,2}, * 打印出现次数最多的那个数,如果最多的次数相同,则打印数字大的那个数。...

本文介绍了一种算法,用于找出整型数组中出现次数最多的数字,若多个数字出现次数相同,则返回数值最大的那一个。示例代码使用Java实现,通过双重循环遍历数组,统计每个元素的出现频率,并记录下出现次数最多且数值最大的元素。

/*
* 给你一个整型数组如{1,3,4,7,2,1,1,5,2},
* 打印出现次数最多的那个数,如果最多的次数相同,则打印数字大的那个数。
*/
public class Test6 {

public static void main(String[] args) {
    Test();
}

public static void Test() {
    int count1, count2 = 0, max = 0;
    int[] a = { 9, 3, 7, 7, 9, 9, 7, 10, 7, 5, 9, 7, 5, 8 };
    for (int i = 0; i < a.length; i++) {
        count1 = 0;
        for (int j = i; j < a.length; j++) {

            if (a[i] == a[j]) {
                count1++;
            }
        }

        if (count2 < count1) {
            count2 = count1;
            max = a[i];

        } 

        else if (count1 == count2) {
            if (max < a[i]) {
                max = a[i];

            }
        }
    }
    System.out.println("出现次数最多的数字是:" + max + ",出现的次数是:" + count2);
}

}

转载于:https://www.cnblogs.com/MountDa/p/5831752.html

<think>好的,我现在需要解决用户的问题:如何用C语言实现查找数组中出现次数超过一半的主元素算法。用户还希望知道输入输出格式和样例数据。首先,我得回忆一下主元素问题的相关知识。 主元素是指在数组中出现次数超过一半的元素,所以这个元素如果存在的话,一定是数组的中位数。根据引用[1]中的提示,可以用快速排序的partition思想来找中位数,但这种方法可能比较复杂。而引用[2]中的代码采用的是摩尔投票法,这种方法的时间复杂度是O(n),空间复杂度是O(1),效率更高。所以可能更适合用户的需求。 首先,我需要确定算法的选择。摩尔投票法分为两个阶段:候选人选举和验证阶段。候选人选举阶段通过遍历数组,维护一个候选人和计数器,遇到相同元素则加,不同则减,当计数器为零时更换候选人。遍历结束后,候选人可能是主元素,但还需要再次遍历数组验证其出现次数是否超过一半。 接下来,我需要考虑如何用C语言实现这个算法。用户给的引用[2]中已经有相关的代码,可以借鉴。比如,定义函数majority_element,参数为数组指针和小。首先处理空数组的情况,返回-1。然后初始化候选人和计数器,遍历数组,按照摩尔投票法更新。之后再次遍历统计候选人出现的次数,确认是否超过半数。 输入输出的格式,用户可能需要一个完整的程序示例。例如,输入可以是预定义的数组,如引用[2]中的例子{1,2,3,2,2,2,5,4,2},输出应该打印数组和结果。另外,需要考虑函数返回-1的情况,比如数组中没有主元素时。 然后需要编写代码,包括主函数,输入输出的处理。用户可能需要一个可运行的示例,所以需要包含头文件,比如stdio.h和stdlib.h。主函数中定义数组,计算小,调用函数,并打印结果。同时,处理输出格式,如引用[2]中的print_array函数,用于美观地打印数组。 测试部分,需要确保代码正确处理各种情况,例如存在主元素、不存在主元素、数组为空等情况。例如,当数组元素都是同一个时,应该正确返回该元素;当没有元素超过一半时返回-1。 另外,用户可能希望输入输出的格式明确,比如输入如何获取。但根据引用[2]中的例子,可能用户希望的是固定数组的示例,而不是动态输入。不过,用户的问题中提到的输入输出格式可能需要更明确的说明。如果用户需要从标准输入读取,可能需要使用scanf读取数组长度和元素,但根据样例,可能更倾向于使用固定数组演示。 最后,生成相关问题,比如询问其他方法如排序法的实现,时间空间复杂度,或者如何处理多个候选人的情况等。这些问题有助于用户深入理解。</think>### 算法实现步骤 #### 算法原理 主元素定义:在数组中出现次数超过$n/2$次的元素。采用摩尔投票算法可以在$O(n)$时间、$O(1)$空间内解决问题,包含两个阶段: 1. **候选人选举**:遍历数组抵消不同元素,维护候选元素 2. **结果验证**:统计候选元素的真实出现频率 #### 代码实现 ```c #include <stdio.h> int majority_element(int *nums, int nums_size) { if (nums == NULL || nums_size == 0) return -1; // 第一阶段:候选人选举 int candidate = nums[0]; int count = 1; for (int i = 1; i < nums_size; i++) { if (count == 0) { candidate = nums[i]; count = 1; } else if (nums[i] == candidate) { count++; } else { count--; } } // 第二阶段:结果验证 int frequency = 0; for (int i = 0; i < nums_size; i++) { if (nums[i] == candidate) frequency++; } return (frequency > nums_size / 2) ? candidate : -1; } // 辅助函数:打印数组 void print_array(int *arr, int size) { printf("["); for (int i = 0; i < size; i++) { printf("%d", arr[i]); if (i != size - 1) printf(", "); } printf("]\n"); } int main() { // 示例测试 int test_case1[] = {1, 2, 3, 2, 2, 2, 5, 4, 2}; // 存在主元素 int test_case2[] = {1, 2, 3, 4, 5}; // 不存在主元素 int test_case3[] = {3}; // 单个元素 printf("测试用例1:"); print_array(test_case1, sizeof(test_case1)/sizeof(int)); printf("结果:%d\n\n", majority_element(test_case1, sizeof(test_case1)/sizeof(int))); printf("测试用例2:"); print_array(test_case2, sizeof(test_case2)/sizeof(int)); printf("结果:%d\n\n", majority_element(test_case2, sizeof(test_case2)/sizeof(int))); printf("测试用例3:"); print_array(test_case3, sizeof(test_case3)/sizeof(int)); printf("结果:%d\n", majority_element(test_case3, sizeof(test_case3)/sizeof(int))); return 0; } ``` #### 输入输出说明 **输入格式要求**: - 数组元素为整数类 - 数组长度不超过内存限制 **输出样例**: ``` 测试用例1:[1, 2, 3, 2, 2, 2, 5, 4, 2] 结果:2 测试用例2:[1, 2, 3, 4, 5] 结果:-1 测试用例3:[3] 结果:3 ``` #### 复杂度分析 - 时间复杂度:$O(n)$,两次线性遍历 - 空间复杂度:$O(1)$,仅使用固定数量的变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值