利用广义表解决
已知全省有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;
}
需要for循环嵌套,外层控制比较的次数,内层控制和谁进行比较;
每次比较都会选择出一个最小值再和其他项进行排序,发现一个比他大的值进行交换次序;
最后输出结果即可;
利用广义表解决统计重复分数值出现次数的问题的解决方案如下:
score_list = []
for i in range(m):
score = int(input("请输入第{}位学生的分数:".format(i+1)))
score_list.append(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)
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]))
完整代码如下:
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]))