假设顺序表L中的元素按从小到大的次序排列,设计算法以删除表中重复的元素,并要求时间尽可能少。要求: (1)以顺序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)为例,统计移动元素的次数。
时间: 2023-09-03 07:04:56 浏览: 202
### 回答1:
可以使用双指针的方法,从头开始遍历顺序表L。用一个指针i记录当前不重复元素的最后位置,另一个指针j从i+1开始向后遍历,如果L[j]与L[i]不相等,则将L[j]移动到i+1的位置,并更新i的位置,否则继续向后遍历。最后,将i+1之后的元素都删除即可。
以下是实现代码:
```python
def remove_duplicates(L):
i = 0
j = 1
count = 0 # 记录移动元素的次数
while j < len(L):
if L[j] != L[i]:
i += 1
L[i] = L[j]
else:
count += 1
j += 1
del L[i+1:]
return count
```
对于顺序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9),该算法的输出为:
```
[1, 2, 3, 4, 5, 6, 7, 8, 9]
移动元素的次数为:12
```
也就是说,该算法一共只需要移动12个元素就可以完成任务。
### 回答2:
算法思路:
1. 初始化一个计数器count用于统计移动元素的次数;
2. 从顺序表的第二个元素开始,依次比较当前元素与其前一个元素是否相等;
3. 如果相等,说明有重复元素,将当前元素后面的所有元素依次前移一位,并将计数器count加1;
4. 如果不相等,将当前元素赋值给前一个元素;
5. 重复步骤2-4,直到扫描完所有元素;
6. 返回去重后的顺序表和移动元素的次数。
以题中的顺序表为例,具体操作如下:
1. 初始化count=0;
2. 从第二个元素开始,与其前一个元素比较,发现第二个元素与其前一个元素相等,将第三个元素及其后面的元素依次前移一位,表变为(1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9);
3. count加1;
4. 继续比较第三个元素与其前一个元素,发现还是相等,再次前移,表变为(1,2,3,3,4,5,5,5,6,6,7,7,8,8,8,9);
5. count加1;
6. 依次类推,直到扫描完所有元素,表变为(1,2,3,4,5,6,7,8,9);
7. 返回去重后的顺序表(1,2,3,4,5,6,7,8,9)和移动元素的次数26。
### 回答3:
算法设计如下:
1. 定义一个新的顺序表newL,用于存放去重后的元素。
2. 设置两个指针i和j,初始值都为1。
3. 从元素L[2]开始遍历,依次比较L[j]和L[i]的值:
a. 如果L[j]和L[i]的值相等,则将j右移一位,继续比较下一个元素。
b. 如果L[j]和L[i]的值不相等,则将L[i]加入newL中,并将i和j的值都右移一位。
4. 最后将L[j]加入newL中。
5. 返回newL作为去重后的顺序表。
以顺序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)为例,统计移动元素的次数:
1. 初始化i和j的值都为1。
2. 第一个元素1不需要移动。
3. 比较L[j]和L[i]的值,分别为1和1,相等,j右移一位。
4. 比较L[j]和L[i]的值,分别为1和2,不相等,将L[i](即2)加入newL中,i和j的值都右移一位。
移动元素的次数为1。
5. 比较L[j]和L[i]的值,分别为2和2,相等,j右移一位。
6. 比较L[j]和L[i]的值,分别为2和3,不相等,将L[i](即3)加入newL中,i和j的值都右移一位。
移动元素的次数为2。
7. 依次类推,直至遍历完所有元素。
8. 将L[j](即9)加入newL中。
9. 返回newL作为去重后的顺序表。
总的移动元素的次数为2,所以时间尽可能少,移动元素的次数为2。
阅读全文