2020王道课后习题P18,综合应用题3:将顺序表L删除所有值为X的元素,时间复杂度:O(n),空间复杂度:O(1)。

博客详细解析了2020王道课后习题P18,讨论如何在长度为n的顺序表L中删除所有值为X的元素,强调采用反向思维,选择不同元素存入线性表,以达到O(n)的时间复杂度和O(1)的空间复杂度。提供了代码示例并展示了删除元素2后的运行效果。

    哈哈,又更新啦,2020王道课后习题P18,综合应用题3:将长度为n的顺序表L删除所有值为X的元素,时间复杂度:O(n),空间复杂度:O(1)。这个问题是有陷阱的,一开始要是采用正面的思路去想问题,会出现错误,所以要采用反向思维,选出与X不同的元素存入线性表,采用这种方法才能实现,那还是上代码吧:

# include <stdio.h>
#include <stdlib.h>
# define InitSize 100 
#include <time.h>
typedef int ElemType;
typedef struct{
	ElemType *data;
	int Maxsize,length;
}SqList;

//插入操作
bool ListInsert(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1)
		return false;
	if(L.length>L.Maxsize)
		return false;
	for(int j=L.length;j>=i;j++)
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;
	L.length++;
	return true;
} 

//删除顺序表中所有的X
bool Delete(SqList &L,ElemType x){
	int k=0;
	for(int i=0;i<L.length;i++)
	{
		if(L.data[i]!=x){
			L.data[k]=L.data[i];
			k++;
		}
	}
	L.length=k;
} 

int main(){ 
	SqList L;
	ElemType e;
	L.data=new ElemType[InitSize];
        L.length=0;
        L.Maxsize=100;
	for(int t=1;t<=5;++t)
	{
		ListInsert(L,t,t);
	}	
	for(i
### 数据结构王道教材课后习题及答案 #### 顺序表删除最小 对于顺序表操作中的删除最小问题,在《2024王道数据结构》教材P18-P19的第2.2.1题提供了详细的解答方法[^1]。该题目要求实现一个函数来移除顺序表中的最小元素并返回新的顺序表。 以下是Python代码示例: ```python def delete_min(lst): if not lst: return [] min_val = min(lst) new_lst = [val for val in lst if val != min_val] return new_lst ``` 此代码通过遍历列表找到最小,并创建一个新的不包含这个最小的新列表作为结果返回。 #### 图的应用——拓扑排序序列 关于图的应用,《25版王道数据结构》第六章讨论了多个应用场景,其中包括如何求解给定有向无环图(DAG)的所有可能的拓扑排序序列[^2]。书中提到的例子展示了几个不同的有效排列方式,如`ABCFDEG`, `ABCDFEG`, `ABCDEFG`, `ABDCFEG` 和 `ABDCEFG`都是合法的结果之一。 #### 二叉树概念理解 在第五章中探讨了有关二叉树的基础理论[^3]。“二叉树为空”的定义是指这棵树没有任何节点存在;然而得注意的是,“空”并不代表对象本身不存在—它只是表示当前状态下没有实际的数据存储于其中而已。另外还强调了一个重要区别:虽然线性表和树允许其内部不含任何项(即它们能够处于“空状态”),但是按照某些形式化描述下的图形结构则不允许完全没有顶点的情况发生。 #### 查找出现次数超过一半的数 最后,在处理数组方面的一个经典问题是找出那个出现了多于总数半数以上的特定数。这个问题可以在《王道22数据结构》第二章找到相应的练习题[^4]。下面给出了一种解决方案思路: ```cpp #include <iostream> using namespace std; // 假设输入已经按升序排列好的整型数组A[]以及长度n int findMajorityElement(int A[], int n){ int count = 1; int candidate = A[0]; // Boyer-Moore 投票算法 for (int i = 1; i < n; ++i) { if (count == 0) { candidate = A[i]; count++; } else if (candidate == A[i]) { count++; } else { count--; } } // 验证候选者确实是多数元素 count = 0; for (int i = 0; i < n; ++i) { if (A[i] == candidate) { count++; } } if (count > n / 2) { return candidate; } else { cout << "No majority element found." << endl; return -1; } } ``` 这段C++程序实现了Boyer-Moore投票算法用于高效查找满足条件的那个唯一数字。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值