2025年 王道考研数据结构 2.2.3 大题 综合应用题 常见暴力解法
分享一些在考场上思路简单,比较容易想到的代码题解法
个人总结,某些算法可能存在不完善的地方,欢迎补充讨论
主函数,题目索引
根据题号(question number)到后文的完整代码中找对应的代码
int main() {
SeqList list;
initSeqList(&list, 50);
insertFakeData(&list);
printSeqList(&list);
// reverseSeqList(&list);
printf("question number 1----------------------------\n");
deleteMinElement(&list);
printf("question number 2----------------------------\n");
reverseSeqList(&list);
printf("question number 3----------------------------\n");
deleteSpecialValue(&list, 3);
printf("question number 4----------------------------\n");
// deleteSpecialScope(&list, 4, 7);
sortSeqListByDoubleLoop(&list);
printf("question number 5----------------------------\n");
deleteRepeatedValueFromOrderedSeqList(&list);
SeqList list2;
initSeqList(&list2, 50);
insertFakeData(&list2);
sortSeqListByDoubleLoop(&list2);
printf("question number 6----------------------------\n");
SeqList *mergedSeqList = mergeOrderedSeqListFromOrderedSeqLists(&list, &list2);
printf("mergedSeqList->length : %d \n", mergedSeqList->length);
printf("question number 7----------------------------\n");
invertTheSequenceOfTwoSeqList(mergedSeqList->data,mergedSeqList->length - 5, mergedSeqList->length - (mergedSeqList->length - 5));
SeqList *orderedSeqList = sortSeqListByDoubleLoop(mergedSeqList);
SeqList * orderedLinearTableWithNoRepeatingElements = deleteRepeatedValueFromOrderedSeqList(mergedSeqList);
// binarySearch(mergedSeqList,7);
printf("question number 8----------------------------\n");
swapTargetWithBehind(mergedSeqList,17);
printf("question number 9----------------------------\n");
int A[] = {1,2,3};
int B[] = {2,3,4};
int C[] = {-1,0,2};
searchElementsThatAreShared(A, B, C,3);
printf("question number 10----------------------------\n");
int arr[] = {3,7,2,1,-2,9,0,6,4,5};
int size = 10;
int moveNumber = 6;
scrollArrayElements(arr, size, moveNumber);
printf("question number 11----------------------------\n");
int arr2[] = {1,3,5,7,9,11,13};
int arr3[] = {2,4,6,8,10,12,14};
int size2 = 7;
searchTheMedianOfEqualLengthLists(arr2,arr3,size2);
printf("question number 12----------------------------\n");
int arr4[] = {0,5,5,3,5,7,5};
int arr5[] = {0,5,5,3,1,5,7};
int size4 = 7;
searchMainElement(arr4, size4);
printf("question number 13----------------------------\n");
int arr6[] = {-5,3,2,3};
int size6= 4;
int arr7[] = {1,2,3};
int size7 = 3;
searchInexistentMinPositiveInteger(arr7,size7);
printf("question number 14----------------------------\n");
int arr8[] = {-1,0,9};
int size8= 3;
int arr9[] = {-25,-10,10,11};
int size9= 4;
int arr10[] = {2,9,17,40,41};
int size10= 5;
searchTheMinimumDistanceOfTheTriplet(arr8,size8,arr9,size9,arr10,size10);
return 0;
}
完整代码
//
// Created by hachimi on 24-8-6.
//
#include "iostream"
using namespace std;
typedef int ElementType;
typedef struct {
ElementType *data;
int length;
int maxSize;
} SeqList;
void initSeqList(SeqList *list, int size) {
list->data = (ElementType *) malloc(size * sizeof(ElementType));
list->length = 0;
}
void insertElement(SeqList *list, int i, ElementType e) {
if (i < 1 || i > list->length + 1) {
exit(-1);
}
for (int j = list->length; j >= i; j--) {
list->data[j] = list->data[j - 1];
}
// i-length >= 1
list->data[i - 1] = e;
list->length++;
}
void insertFakeData(SeqList *list) {
insertElement(list, 1, 9);
insertElement(list, 1, 2);
insertElement(list, 2, 3);
insertElement(list, 1, 1);
insertElement(list, 1, 2);
insertElement(list, 3, 6);
insertElement(list, 1, 3);
insertElement(list, 5, 5);
insertElement(list, 4, 7);
insertElement(list, 6, 9);
insertElement(list, 5, 14);
insertElement(list, 4, 12);
insertElement(list, 6, 17);
}
void printSeqList(SeqList *list) {
printf("list after change:\n");
for (int i = 0; i < list->length; i++) {
printf("%d, ", list->data[i]);
}
printf("\n");
}
ElementType deleteMinElement(SeqList *list) {
if (list->length == 0) {
printf("顺序表为空,程序退出");
exit(-1);
}
int minValue = list->data[0], minElementIndex = 0;
for (int i = 0; i < list->length; i++) {
if (list->data[i] < minValue) {
minValue = list->data[i];
minElementIndex = i;
}
}
list->data[minElementIndex] = list->data[list->length - 1];
list->length--;
printf("Removing the smallest element in the sequential list is done\n");
printSeqList(list);
return minValue;
}
void reverseSeqList(SeqList *list) {
int temp = 0;
for (int i = 0, j = list->length - 1; j > i; i++, j--) {
temp = list->data[j];
list->data[j] = list->data[i];
list->data[i] = temp;
}
printf("reverse the sequential list is complete\n");
printSeqList(list);
}
void deleteSpecialValue(SeqList *list, ElementType e) {
int saveElementIndex = 0;
for (int i = 0; i < list->length; i++) {
if (list->data[i] != e) {
list->data[saveElementIndex] = list->data[i];
saveElementIndex++;
}
}
list->length = saveElementIndex;
printf("delete Special Value { %d } is complete\n", e);
printSeqList(list);
}
void deleteSpecialScope(SeqList *list, ElementType s, ElementType t) {
int saveElementIndex = 0;
for (int i = 0; i < list->length; i++) {
if (list->data[i] < s || list->data[i] > t) {
list->data[saveElementIndex] = list->data[i];
saveElementIndex++;
}
}
list->length = saveElementIndex;
printf("delete Special Scope [ %d ~ %d ] is complete\n", s, t);
printSeqList(list);
}
SeqList * sortSeqListByDoubleLoop(SeqList *list) {
int temp = 0;
for (int i = 0; i < list->length; i++) {
for (int j = i + 1; j < list->length; j++) {
if (list->data[j] < list->data[i]) {
temp = list->data[i];
list->data[i] = list->data[j];
list->data[j] = temp;
}
}
}
printf("sortSeqListByDoubleLoop is complete\n");
printSeqList(list);
return list;
}
SeqList * deleteRepeatedValueFromOrderedSeqList(SeqList *list) {
int i = 0, j = 1;
while (i < list->length && j < list->length) {
if (list->data[i] == list->data[j]) {
j++;
} else {
list->data[++i] = list->data[j++];
}
}
list->length = i + 1;
printf("deleteRepeatedValueFromSequenceList is complete\n");
printSeqList(list);
return list;
}
SeqList * mergeOrderedSeqListFromOrderedSeqLists(SeqList *list1, SeqList *list2) {
printf("The two ordered order tables waiting to be merged are as follows\n");
printSeqList(list1);
printSeqList(list2);
// 动态分配 list3 以确保其生命周期在函数返回后仍然有效
SeqList* list3 = (SeqList*)malloc(sizeof(SeqList));
// SeqList list3;
initSeqList(list3, 50);
for (int i = 0, j = 0, k = 0; k < list1->length + list2->length; k++) {
if (list1->data[i] < list2->data[j]) {
list3->data[k] = list1->data[i];
i++;
} else {
list3->data[k] = list2->data[j];
j++;
}
list3->length++;
}
printf("mergeOrderedSeqListFromOrderedSeqLists is complete\n");
printSeqList(list3);
return list3;
}
void invertTheSequenceOfTwoSeqList(ElementType *arr, int m, int n){
ElementType tempArr[m];
for(int i = 0; i < m; i++){
tempArr[i] = arr[i];
}
printf("\n");
for(int i = 0, j = m; j < m + n; i++, j++){
arr[i] = arr[j];
}
for(int i = n, j = 0; i < m + n; i++, j++){
arr[i] = tempArr[j];
}
printf("invertTheSequenceOfTwoSeqList is complete\n");
for(int i = 0; i < m + n; i++){
printf("%d, ",arr[i]);
}
printf("\n");
}
int binarySearch(SeqList * list, ElementType target){
int mid, left = 0, right = list->length - 1;
while(left <= right){
mid = (left + right) / 2;
if(target < list->data[mid]){
right = mid - 1;
}else if(target > list->data[mid]){
left = mid + 1;
}
else{
printf("binarySearch is complete, find { %d }, index is { %d }, addressOrder is { %d } \n", target, mid, mid + 1);
return mid;
}
}
insertElement(list, left + 1, target);
printf("binarySearch is complete, can not find { %d } , It has been sequentially inserted into the sequential list \n", target);
return -1;
}
void swapTargetWithBehind(SeqList * list, ElementType target){
int targetIndex = binarySearch(list, target);
if(targetIndex == -1){
printSeqList(list);
return;
}
if(targetIndex == list->length - 1){
printf("swapTargetWithBehind can not complete, because target is the The last element\n");
return;
}
ElementType temp = list->data[targetIndex + 1];
list->data[targetIndex + 1] = list->data[targetIndex];
list->data[targetIndex] = temp;
printf("swapTargetWithBehind is complete\n");
printSeqList(list);
}
int searchMaxElement(int arr[], int size){
int max = arr[0], maxElementIndex = 0;
for(int i = 1; i < size; i++){
if(arr[i] > max){
max = arr[i];
maxElementIndex = i;
}
}
return max;
}
int searchMaxElement(int a, int b, int c){
int max = a;
if(b > max){
max = b;
}else if(c > max){
max = c;
}
return max;
}
void searchElementsThatAreShared(int A[], int B[], int C[], int size){
for(int i = 0, j = 0, k = 0; i < size && j < size && k < size; ){
if(A[i] == B[j] && B[j] == C[k]){
printf("%d\n",A[i]);
i++,j++,k++;
continue;
}
int maxElement = searchMaxElement(A[i], B[j], C[k]);
if(A[i] < maxElement){
i++;
}
if(B[i] < maxElement){
j++;
}
if(C[i] < maxElement){
k++;
}
}
printf("searchElementsThatAreShared is complete\n");
}
void scrollArrayElements(int arr[], int size, int p) {
int arr2[size];
for(int i = 0; i < size; i++){
arr2[i] = arr[i];
printf("%d,",arr[i]);
}
printf("\n");
for(int i = 0, j = 0; i < size; i++){
if(i < p){
int back = i - p;
arr[size + back] = arr2[i];
}else if(i < size - p){
arr[i - p] = arr[i];
}else{
arr[i - p] = arr2[i];
}
}
for(int i = 0; i < size; i++){
printf("%d,",arr[i]);
}
printf("\n");
printf("scrollArrayElements is complete, scroll scope is { %d }\n", p);
}
void searchTheMedianOfEqualLengthLists(int arr1[], int arr2[],int size){
int newSize = 2 * size;
int arr[newSize];
for(int i = 0; i < size; i++){
arr[i] = arr1[i];
}
for(int i = 0; i < size; i++){
arr[i + size] = arr2[i];
}
printf("auxiliary array of searchTheMedianOfEqualLengthLists \n");
for(int i = 0; i < newSize; i++){
printf("%d, ", arr[i]);
}
printf("\n");
int temp;
for(int i = 0; i < newSize; i++){
for(int j = i + 1; j < newSize; j++){
if(arr[i] > arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("ordered auxiliary array of searchTheMedianOfEqualLengthLists \n");
for(int i = 0; i < newSize; i++){
printf("%d, ", arr[i]);
}
printf("\n");
printf("searchTheMedianOfEqualLengthLists is complete, medianIndex is { %d }, median is { %d }\n", newSize / 2, arr[newSize/2]);
return;
}
int searchMainElement(int arr[], int size) {
int appearNumArr[size];
for(int i = 0; i < size; i++){
appearNumArr[i] = 0;
}
for(int i = 0; i < size; i++){
// appearNumArr[arr[i]]++;
appearNumArr[arr[i]] += 1;
}
for(int i = 0; i < size; i++){
if(appearNumArr[i] > size / 2){
printf("searchMainElement is success, result is : { %d } \n", i);
return i;
}
}
printf("searchMainElement is error, do not find result\n");
return -1;
}
int searchInexistentMinPositiveInteger(int arr[], int size){
int positiveArr[size];
for(int i = 0; i < size; i++){
positiveArr[i] = -1;
}
int j = 0;
for(int i = 0; i< size; i++){
if(arr[i] > 0){
positiveArr[j] = arr[i];
j++;
}
}
// for(int i = 0; i < j; i++){
// printf("%d, ",positiveArr[i]);
// }
// printf("\n");
int temp = -1;
for(int i = 0; i < j; i++){
for(int k = i + 1; k < j; k++){
if(positiveArr[i] > positiveArr[k]){
temp = positiveArr[i];
positiveArr[i] = positiveArr[k];
positiveArr[k] = temp;
}
}
}
printf("ordered positiveInteger : \n");
for(int i = 0; i < j; i++){
printf("%d, ",positiveArr[i]);
}
printf("\n");
if(positiveArr[0] > 1){
printf("searchInexistentMinPositiveInteger is complete, result is { %d }\n",positiveArr[0] - 1);
return positiveArr[0] - 1;
}
for(int k = 0, i = positiveArr[k]; i < positiveArr[j]; i++,k++){
if(i != positiveArr[k]){
printf("searchInexistentMinPositiveInteger is complete, result is { %d }\n",i);
return i;
}
}
return -1;
}
void searchTheMinimumDistanceOfTheTriplet(int arr1[], int size1, int arr2[], int size2, int arr3[], int size3){
int minD = 999999;
int minArr[3];
for(int i = 0; i < size1; i++){
for(int j = 0; j < size2; j++){
for(int k = 0; k < size3; k++){
int d1 = arr1[i] - arr2[j] > 0 ? arr1[i] - arr2[j] : arr2[j] - arr1[i];
int d2 = arr2[j] - arr3[k] > 0 ? arr2[j] - arr3[k] : arr3[k] - arr2[j];
int d3 = arr3[k] - arr1[i] > 0 ? arr3[k] - arr1[i] : arr1[i] - arr3[k];
if(d1 + d2 + d3 < minD){
minD = d1 + d2 + d3;
minArr[0] = arr1[i];
minArr[1] = arr2[j];
minArr[2] = arr3[k];
}
}
}
}
printf("minD is : { %d }\n", minD);
printf("minArr is : (%d, %d, %d)\n", minArr[0], minArr[1], minArr[2]);
}
/*
* 2025年 王道考研数据结构 2.2.3 大题 综合应用题 常见暴力解法
* 分享一些在考场上思路简单,比较容易想到的代码题解法
* 个人总结,某些算法可能存在不完善的地方,欢迎补充讨论
*/
int main() {
SeqList list;
initSeqList(&list, 50);
insertFakeData(&list);
printSeqList(&list);
// reverseSeqList(&list);
printf("question number 1----------------------------\n");
deleteMinElement(&list);
printf("question number 2----------------------------\n");
reverseSeqList(&list);
printf("question number 3----------------------------\n");
deleteSpecialValue(&list, 3);
printf("question number 4----------------------------\n");
// deleteSpecialScope(&list, 4, 7);
sortSeqListByDoubleLoop(&list);
printf("question number 5----------------------------\n");
deleteRepeatedValueFromOrderedSeqList(&list);
SeqList list2;
initSeqList(&list2, 50);
insertFakeData(&list2);
sortSeqListByDoubleLoop(&list2);
printf("question number 6----------------------------\n");
SeqList *mergedSeqList = mergeOrderedSeqListFromOrderedSeqLists(&list, &list2);
printf("mergedSeqList->length : %d \n", mergedSeqList->length);
printf("question number 7----------------------------\n");
invertTheSequenceOfTwoSeqList(mergedSeqList->data,mergedSeqList->length - 5, mergedSeqList->length - (mergedSeqList->length - 5));
SeqList *orderedSeqList = sortSeqListByDoubleLoop(mergedSeqList);
SeqList * orderedLinearTableWithNoRepeatingElements = deleteRepeatedValueFromOrderedSeqList(mergedSeqList);
// binarySearch(mergedSeqList,7);
printf("question number 8----------------------------\n");
swapTargetWithBehind(mergedSeqList,17);
printf("question number 9----------------------------\n");
int A[] = {1,2,3};
int B[] = {2,3,4};
int C[] = {-1,0,2};
searchElementsThatAreShared(A, B, C,3);
printf("question number 10----------------------------\n");
int arr[] = {3,7,2,1,-2,9,0,6,4,5};
int size = 10;
int moveNumber = 6;
scrollArrayElements(arr, size, moveNumber);
printf("question number 11----------------------------\n");
int arr2[] = {1,3,5,7,9,11,13};
int arr3[] = {2,4,6,8,10,12,14};
int size2 = 7;
searchTheMedianOfEqualLengthLists(arr2,arr3,size2);
printf("question number 12----------------------------\n");
int arr4[] = {0,5,5,3,5,7,5};
int arr5[] = {0,5,5,3,1,5,7};
int size4 = 7;
searchMainElement(arr4, size4);
printf("question number 13----------------------------\n");
int arr6[] = {-5,3,2,3};
int size6= 4;
int arr7[] = {1,2,3};
int size7 = 3;
searchInexistentMinPositiveInteger(arr7,size7);
printf("question number 14----------------------------\n");
int arr8[] = {-1,0,9};
int size8= 3;
int arr9[] = {-25,-10,10,11};
int size9= 4;
int arr10[] = {2,9,17,40,41};
int size10= 5;
searchTheMinimumDistanceOfTheTriplet(arr8,size8,arr9,size9,arr10,size10);
return 0;
}