2.1 顺序表

03.对长度为n的顺序表L。编写一个时间复杂度为O(n),空间复杂度为1的算法,删除顺序表中所有值为x的元素

#include <iostream>
using namespace std;

// 算法空间复杂度为O(1)意味着只能原地修改数组
void deleteAtValue(int arr[], int val, int &length) {
	int k = 0;
	for (int i = 0; i < length; ++i) {
		if (arr[i] == val) { k++; }
		else { arr[i - k] = arr[i]; }
	}
	length = length - k;
}

04从顺序表中删除其值在给定值s和t之间(包括s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,返回错误信息并退出程序

#include <iostream>
using namespace std;

void deleteAtInterval(int arr[], int s, int t,int &length) {
	int k = 0;
	for (int i = 0; i < length; ++i) {
		if (arr[i] <= t && arr[i] >= s) { k++; }
		else {
			arr[i - k] = arr[i];
		}
	}
	length -= k;
}

int main() {
	int arr[] = { 23,123,445,3,13,213,435,4341,22,2,3,1,3,5,9,8 };
	int len = sizeof(arr) / sizeof(arr[0]);
	deleteAtInterval(arr, 1, 100, len);
	for (int i = 0; i < len; ++i) {
		cout << arr[i] << " ";
	}
}

05.从顺序表中删除所有其值重复的元素,使表中的元素互不相同。

#include <iostream>
using namespace std;

void Deduplicate(int arr[], int &length) {
    for (int i = 0; i < length; i++) {
        for (int j = i + 1; j < length;) {
            if (arr[i] == arr[j]) {
                for (int k = j; k < length - 1; k++) {
                    arr[k] = arr[k + 1];
                }
                length--;
            } else {
                j++;
            }
        }
    }
}

int main() {
    int arr[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
    int length = sizeof(arr) / sizeof(arr[0]);

    Deduplicate(arr, length);

    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

08.线性表(a1,a2...an)中的元素递增有序且按顺序存储于计算机内,要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其于后继位置相交换,若找不到,则将其插入表中并且使表中元素仍然有序递增

#include <iostream>
using namespace std;

void bSearch(int arr[], int x, int& length) {
	int l = -1;
	int r = length;
	while (l + 1 < r) {
		int mid = (l + r) / 2;
		if (arr[mid] >= x) { r = mid; }
		else { l = mid; }
	}
	if (arr[r] == x) { swap(arr[r], arr[r + 1]); }
	else {
		for (int i = length - 1; i > r; --i) {
			arr[r + 1] = arr[r];
		}
		arr[r] = x;
	}
	length++;

}

09.给定三个序列A,B,C,长度均为n,且均无重复元素的递增序列,请设计一个时间复杂度上尽可能高效的算法,逐行输出同时存在于这三个序列的所有元素

#include <iostream>
using namespace std;

int bSearch(int arr[], int x, int& length) {
	int l = -1;
	int r = length;
	while (l + 1 < r) {
		int mid = (l + r) / 2;
		if (arr[mid] >= x) { r = mid; }
		else { l = mid; }
	}
	return r;
}
int sameElement(int arr1[],int arr2[],int arr3[],int length) {
	for (int i = 0; i < length; ++i) {
		int idx1 = bSearch(arr2, arr1[i],length);
		int idx2 = bSearch(arr3, arr1[i],length);
		if (arr1[i] == arr2[idx1] && arr2[idx1] == arr3[idx2]) { cout << arr1[i] << endl; }
	}
	return 0;
}

13.给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

#include <iostream>
using namespace std;

int findSmallestMissingPositive(int arr[], int n) {
    bool present[100000] = { false };

    for (int i = 0; i < n; i++) {
        if (arr[i] > 0 && arr[i] <= n) {
            present[arr[i]] = true;
        }
    }

    for (int i = 1; i <= n; i++) {
        if (!present[i]) {
            return i;
        }
    }

    return n + 1;
}

14.定义三元组(a,b,c)的距离D = |a-b|+|b-c|+|c-a|,给定三个非空整数集合S1,S2,S3,按升序分别存储在3个数组中。请设计一个尽可能高效的算法,计算并输出所有可能的三元组中的最小距离

#include <iostream>
#include <limits.h>

int minDistance(int arr1[], int size1, int arr2[], int size2, int arr3[], int size3) {
    int minDist = INT_MAX;
    int i = 0, j = 0, k = 0;

    while (i < size1 && j < size2 && k < size3) {
        int dist = abs(arr1[i] - arr2[j]) + abs(arr2[j] - arr3[k]) + abs(arr3[k] - arr1[i]);
        minDist = std::min(minDist, dist);

        int minVal = std::min(arr1[i], std::min(arr2[j], arr3[k]));

        if (arr1[i] == minVal) i++;
        else if (arr2[j] == minVal) j++;
        else k++;
    }

    return minDist;
}

01.从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删除的元素。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行

#include <iostream>
using namespace std;

// 计算数组中的最小值的索引,同时传入数组长度
int MIN(int arr[], int length) {
    int m = 0x3f3f3f3f;
    int idx = -1;
    for (int i = 0; i < length; ++i) {
        if (arr[i] < m) {
            m = arr[i];
            idx = i;
        }
    }
    return idx;
}

// 弹出最小值所在位置的元素,同时传入数组和数组长度
int pop(int arr[], int& length) {
    int minIndex = MIN(arr, length);
    int res = arr[minIndex];
    arr[minIndex] = arr[length - 1];
    length--;
    return res;
}

int main() {
    int arr[] = { 123, 4, 2, 31, 43 };
    int length = sizeof(arr) / sizeof(arr[0]);
    int res = pop(arr, length);
    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";
    }
    cout << "弹出的最小元素是:" << res << endl;
}

02.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)

#include <iostream>
using namespace std;

// 算法空间复杂度为O(1)意味着只能原地修改数组
void reverse(int arr[],int length) {
	int l, r;
	l = 0;
	r = length - 1;
	while (l < r) {
		int temp = arr[l];
		arr[l] = arr[r];
		arr[r] = temp;
		l++;
		r--;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值