我在java中使用本书的数据结构和算法来学习(你猜对了) - 数据结构和算法。这段代码让我很困惑。我已经测试了它并且它可以工作,但我没有看到我们指定的代码中删除55的确切位置?
我看到我们在数组中搜索它并将数据元素向上移动但是没有看到我们告诉编译器删除的位置55.
courseDAO
答案 0 :(得分:1)
准确地说,此代码不会删除数组元素;它会覆盖它。
注意j
如何在第一个循环之外声明,并在第二个循环中用于初始化k
的值。第一个循环遍历数组j
,直到j
“指向”具有值55
的元素。发生这种情况时,代码将通过break
退出循环,因此当第二个循环读取j
时,它仍然指向数组中存储55
的位置。现在,第二个循环将元素从k+1
- st位置复制到k
- th,“覆盖”第一次迭代时55
的值,然后移动其余的值。连续迭代。
考虑这个例子:
Index: 0 1 2 3 4 5
Value: 30 40 55 60 70 80
第一个循环j
设置为2
后。第二个循环的每次迭代都会更改数组,如下所示:
Index: 0 1 2 3 4 5
Iteration 0: 30 40 55 60 70 80
Iteration 1: 30 40 60 60 70 80
Iteration 2: 30 40 60 70 70 80
Iteration 3: 30 40 60 70 80 80
此时nElems
递减,确保在程序再次运行时忽略最后一个元素(即80
)。
答案 1 :(得分:1)
为了举例,假设:
searchKey = 3
arr = {1,2,3,4,0,0,0}
nElems = 4
这意味着我们有一个包含七个插槽的数组,但是数组的最后三个元素未被周围的数据结构使用。
第一个for
循环只是查找包含j
的索引searchKey
(searchValue
本来是一个更好的名字,但是唉)。找到正确的索引后,break
s,设置j
。在我们的示例中,j = 2
在第一个循环结束时。什么都没有改变,我们刚刚找到了我们要清除的索引。
第二个for
循环通过将找到的元素后面的所有元素向下移动一个索引(并覆盖过程中找到的索引)来完成实际的工作,因此arr[2]
设置为arr[3]
}和arr[3]
设置为arr[4]
,依此类推。在第二个循环结束时我们有
arr = {1,2,4,4,0,0,0}
最后,我们将nElems
减1,这样数据结构中现在只有三个元素。数组中的最后四个元素(4,0,0,0
)现在都是垃圾,如果添加了更多元素,它们将被写入。
答案 2 :(得分:0)
它被第二个for循环的第一次迭代覆盖。