关于#广义表#的问题,如何解决?

利用广义表解决
已知全省有m个学生参加计算机等级考试,其成绩值均在0到100之间的整数值,且成绩中有很多值重复出现,统计各个分数值重复出现的次数。



广义表是数据结构的概念,实际上就是用链表。以下代码需要vs2015+以上

#include <iostream>
#include <list>
#include <map>

struct ListNode {
    int data; 
    ListNode* subList;
    ListNode* next; 
};

ListNode* createGeneralizedList(const std::list<int>& scores) {
    ListNode* head = NULL;
    ListNode* current = NULL;
    
    for (const auto& score : scores) {
        ListNode* newNode = new ListNode;
        newNode->data = score;
        newNode->subList = nullptr;
        newNode->next = nullptr;
        
        if (head == nullptr) {
            head = newNode;
            current = newNode;
        } else {
            current->next = newNode;
            current = newNode;
        }
    }
    
    return head;
}

std::map<int, int> countScoreOccurrences(ListNode* head) {
    std::map<int, int> occurrences;
    
    ListNode* current = head;
    while (current != nullptr) {
        int score = current->data;
        occurrences[score]++;
        
        current = current->next;
    }
    
    return occurrences;
}

int main() {
    std::list<int> scores = { 85, 92, 78, 92, 90, 78, 85, 92, 100, 85 };
    
    ListNode* head = createGeneralizedList(scores);
    std::map<int, int> occurrences = countScoreOccurrences(head);
    
    for (const auto& entry : occurrences) {
        std::cout << "成绩:" << entry.first << ",出现次数:" << entry.second << std::endl;
    }    
    return 0;
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7545096
  • 这篇博客也不错, 你可以看下循环100次,产生1-6之间的随机整数,统计每个数出现的概率百分比
  • 除此之外, 这篇博客: 随机生成[0,100]之间的10个整数,将其置于一维数组中,使用选择法对其递增排序(自定义排序算法)中的 分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 需要for循环嵌套,外层控制比较的次数,内层控制和谁进行比较;
    每次比较都会选择出一个最小值再和其他项进行排序,发现一个比他大的值进行交换次序;
    最后输出结果即可;

  • 您还可以看一下 杨帅老师的自然语言处理基于深度学习的中文命名实体识别实战课程中的 构建字典映射小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    利用广义表解决统计重复分数值出现次数的问题的解决方案如下:

    1. 创建一个空的广义表,可以使用python语言中的列表来模拟广义表的操作。
    score_list = []
    
    1. 循环读入m个学生的成绩,将成绩添加到广义表中。
    for i in range(m):
        score = int(input("请输入第{}位学生的分数:".format(i+1)))
        score_list.append(score)
    
    1. 对广义表进行排序,常见的排序算法有插入排序、冒泡排序、选择排序、归并排序、快速排序等。这里选择使用归并排序,因为归并排序的时间复杂度为O(nlogn),效率比较高。
    def merge_sort(array):
        def merge(left, right):
            result = []
            i, j = 0, 0
            while i < len(left) and j < len(right):
                if left[i] <= right[j]:
                    result.append(left[i])
                    i += 1
                else:
                    result.append(right[j])
                    j += 1
            result += left[i:]
            result += right[j:]
            return result
    
        if len(array) <= 1:
            return array
        mid = len(array) // 2
        left = merge_sort(array[:mid])
        right = merge_sort(array[mid:])
        return merge(left, right)
    
    score_list = merge_sort(score_list)
    
    1. 使用散列表统计每个分数值的出现次数。在创建散列表时,可以将分数值作为key,出现次数作为value。这里我们采用python语言中的字典作为散列表。
    score_dict = {}
    for score in score_list:
        if score in score_dict:
            score_dict[score] += 1
        else:
            score_dict[score] = 1
    
    1. 输出每个分数值和其出现次数。
    for score in score_dict:
        print("分数值{}出现{}次".format(score, score_dict[score]))
    

    完整代码如下:

    def merge_sort(array):
        def merge(left, right):
            result = []
            i, j = 0, 0
            while i < len(left) and j < len(right):
                if left[i] <= right[j]:
                    result.append(left[i])
                    i += 1
                else:
                    result.append(right[j])
                    j += 1
            result += left[i:]
            result += right[j:]
            return result
    
        if len(array) <= 1:
            return array
        mid = len(array) // 2
        left = merge_sort(array[:mid])
        right = merge_sort(array[mid:])
        return merge(left, right)
    
    m = int(input("请输入参加考试的学生人数:"))
    score_list = []
    for i in range(m):
        score = int(input("请输入第{}位学生的分数:".format(i+1)))
        score_list.append(score)
    
    score_list = merge_sort(score_list)
    
    score_dict = {}
    for score in score_list:
        if score in score_dict:
            score_dict[score] += 1
        else:
            score_dict[score] = 1
    
    for score in score_dict:
        print("分数值{}出现{}次".format(score, score_dict[score]))