• 数据结构实训(一)--- 数组主元素(2013考研题)


    【问题描述】
    已知一个整数序列A长度为N其中若存在a且a的个数大于N/2则称为A的主元素
    例如0 5 5 3 5 7 5 5 则为主元素 5
    又如0 5 5 3 5 1 5 7则中没有主元素。
    假设的元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出的主元素。若存在主元素则输出该元素否则输出-1。

    【输入形式】
    一个整数数组
    【输出形式】
    主元素
    【样例输入】
    0 5 5 3 5 7 5 5
    【样例输出】
    5
    【样例说明】
    长度为8,共有5个5。

    个人方法:(暴力破解)

    #include <iostream>
    #include <vector>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
        vector<int> input;
        int num;
        char ch;
    
        // 接收数据 并压入向量
        do
        {
            cin >> num;
            input.push_back(num);
        }
        while( (ch=getchar()) != EOF && ch != '
    ');
    
        // 双层遍历统计 每个数的次数
        for (int j=0; j<input.size(); j++)
        {
            int cont = 0;   // 出现次数变量初始化
    
            for(int i=j; i<input.size(); i++) // 从a[j]开始,对其后面出现次数进行计数
            {
                if(input[i] == input[j])
                {
                    cont++;
                }
            }
    
            if(cont*2>input.size()) // 满足条件程序结束
            {
                cout<< input[j];
                return 0;
            }
        }
        cout << "-1";
        return 0;
    }

    老师讲解

    #include<iostream>
    #include<sstream>
    using namespace std;
    
    int main()
    {
        string line;
        getline(cin, line);     // 获取一行输入
        istringstream ss(line); // 转换为输入流
    
        int a[100];
        int N = 0;
        while(ss>>a[N])     // 输入流内容 传入 a[N] 类似cin输入
        {
            N++;
        }
    
        int cont[N]= {0};   // 开辟与输入数据相同的大小的数组 并初始化为0 用来计数
        for(int i=0; i<N; i++)
        {
            cont[a[i]]++;   // cont数组计算 值为a[i] 的出现次数
            if(cont[a[i]]>N/2)  // 判断cont数组 中a[i] 的出现次数 若满足条件程序退出
            {
                cout << a[i];
                return 0;
            }
        }
        cout << "-1";
        return 0;
    }

    个人总结:

      以cont数组中的下标与输入数组中的值进行映射关系,充分利用两数组数组之间的关系进行解题。

    知识拓展:

      c++中,未知数据量进行数据读入,可采用老师讲解的方法。 c语言中可采用个人方法中的代码。

  • 相关阅读:
    ptmalloc内存分配和回收详解(文字版)
    HITCTF2018
    缓冲区溢出保护机制——Windows
    缓冲区溢出保护机制——Linux
    TAMUCTF
    反汇编简介
    apkg命令
    ubuntu基本命令
    ubuntu命令~
    apt-get用法
  • 原文地址:https://www.cnblogs.com/DullRabbit/p/12558317.html
Copyright © 2020-2023  润新知