数据结构实训(一)--- 1

时间:2020-03-24
本文章向大家介绍数据结构实训(一)--- 1,主要包括数据结构实训(一)--- 1使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

数组主元素(2013考研题)
1.
【问题描述】
已知一个整数序列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 != '\n');

    // 双层遍历统计 每个数的次数
    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语言中可采用个人方法中的代码。

原文地址:https://www.cnblogs.com/DullRabbit/p/12558317.html