2025年 王道考研数据结构 2.2.3 大题 综合应用题 常见暴力解法,分享一些在考场上思路简单,比较容易想到的代码题解法

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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值