长度为n的数组,有一个数重复出现了n/2+1次,找出

问题:

长度为n的数组,有一个数重复出现了n/2+1次,找出这个数;

解决:

比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止;

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

int fun(int inp[],int size)
{
  assert(inp!=NULL && size>1);
  int i=0,j=0;
  for(;i<size-1;i++){
     int sum = 1;
     for(j=i+1;j<size;j++){
        if(inp[i]==inp[j]) sum++;
     }
     if(size/2+1 == sum) return inp[i];
  }
  return -1;
}

int main(){
  int input[]={1,2,5,2,1,8,2,2,2,2};
  int ret = fun(input,10);
  printf("result = %d\n",ret);
  return 0;
}

结果如下:

[[email protected] Desktop]# ./a.out
result = 2
[[email protected] Desktop]# 

长度为n的数组,有一个数重复出现了n/2+1次,找出

时间: 2024-12-26 00:11:53

长度为n的数组,有一个数重复出现了n/2+1次,找出的相关文章

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

需要排序的最短子数组的长度 貌似在leetcode上遇到过,就是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组. from:https://blog.csdn.net/behboyhiex/article/details/80758686 [题目] 给定一个无序数组arr,求出需要排序的最短子数组长度. 例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序. [思路] 双指针 第一次从左向右遍历,找左边比当前位置大的 第

c语言:输出一个数组,判断是否存在问题,若有,请找出问题并改正

输出一个数组,判断是否存在问题,若有,请找出问题并改正 程序: #include <stdio.h> int main() { int i, a[5] ; for (i = 0; i <=5; i++) { a[i] = 0; } for (i = 0; i <5; i++) { printf("%d\n", a[i]); } return 0; } 结果:出现崩溃 分析:循环的次数超过了数组长度 改正后程序: #include <stdio.h>

输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: 输入n个数组,数组长度不等,从每个数组取出一个数进行组合,求出所有的组合. 例子: int a[]={1,2}; int b[]={3,4,5}; 可能的组合:{1,3}:{1,4}:{1,5}:{2,3}:{2,4}:{2,5}: 搞了40分钟左右,不辱使命~ JAVA代码实现: import j

面试算法题:16个数,最多用20次比较,找出第二大的数?

这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较. 既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法. 假设16个数中最大的是A,第二大的是B. 首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示 红色路线是最大数经过的路径. 接下来分析B可能存在的位置. 将16个数分为左部分和右部分各8位: 1.如果A和B在两个不同的部分(A在左部分,

有100个数,每个数的取值范围是[20 55], 找出其中的重复的数,重复的次数.

NSCountedSet *set  = [NSCountedSet setWithCapacity:100];        for (int i = 0; i < 10; i++) {            int random = arc4random() % (55 - 20 + 1) + 20;            printf("%d ", random);            [set addObject:@(random)];        }       

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这个算法的时间复杂度是O(n),另外用了两个辅助变量. k用于临时存储数组中的数据,j用于存储某个数出现的次数. 开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k 因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数. 下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意. c实现 1 #include<stdio.h

数组a[N],存放了1~N-1个数,其中某个数重复一次【转】

本文转自:http://blog.csdn.net/zhuimengzh/article/details/6720388 数组a[N],存放了1 至N-1 个数,其中某个数重复一次.写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a[],int N) 方法一: [cpp] view plain copy //好算法,因为第二个重复的数字其位置肯定不会变化,而a[a[0]]正好可以访问到每一个位置的数据. int do_dup(int a[],int 

找出一个整数数组中超过数组长度一半的元素(Java)

Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 package com.study.zhipengs.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, * 2}.由于数字2在数组中出现了5次,超过数组长度