如果你有一个整数数组,例如1 2 5 4 3 2 1 5 9 从C中删除整数循环的最佳方法是什么? 即,上面,1-2-5-4-3-2-1是一个循环,应该删除只留下1 5 9。
我该怎么做? 谢谢!
答案 0 :(得分:2)
数组中的直接搜索可能如下所示:
int arr[] = {1, 2, 5, 4, 3, 2, 1, 5, 9};
int len = 9;
int i, j;
for (i = 0; i < len; i++) {
for (j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
// remove elements between i and j
memmove(&arr[j], &arr[i], (len-i)*sizeof(int));
len -= i-j;
i = j;
break;
}
}
}
答案 1 :(得分:1)
构建图表并根据运行深度优先搜索边缘。
在访问顶点时标记顶点,在遍历图形时添加边,不添加已选择的边 - 它们将连接先前访问过的组件,从而创建循环。
从你的例子中的数组我们无法分辨出什么是循环。
在你的例子中,2 - &gt; 5和1 - &gt; 5以及1 - > 2如图(?)所示:
1 -> 2
| |
| V
+--> 5
那么连接哪些元素的信息在哪里?
答案 2 :(得分:1)
有一种简单的方法,O(n ^ 2)复杂度:只需从头开始迭代每个数组条目,然后在数组中搜索最后一个相同的值。如果它与您当前的位置处于同一位置,请继续。否则,删除序列(初始值除外)并继续。您应该能够使用两个嵌套的for循环和一个条件memcpy来实现它。
有一种更复杂的方式,O(n log n)复杂度。如果您的数据集很大,那么这个数据集对于性能来说会更好,尽管它实现起来更复杂,因此更容易出错。
1)对数组进行排序 - 如果使用良好的排序算法,这是O(n log n)部分。通过引用这样做 - 你想保留原件。这会将所有相同的值一起移动。按原始数组中的位置打破排序顺序关系,这将有助于下一步。
2)在排序的数组(O(n))上迭代一次,寻找相同值的运行。因为这些运行本身按位置排序,所以通过比较相邻对的相等性,您可以轻松找到涉及该值的每个循环。从原始数组中删除(不删除)每个循环,用lastinel替换除last之外的每个值(零可能有效)。不要缩小间隙,否则引用会中断。
注意:在此阶段,您需要忽略已从阵列中删除的任何端点。因为他们将解决哨兵,你只需要小心不要删除任何一端涉及哨兵价值的“跑”。
3)丢弃已排序的数组,并使用标记来关闭原始数组中的间隙。这应该是O(n)。
实际上,用任何特定语言实现这一点都留给读者练习。 : - )