例子问题
问题21:计算机科学
下面哪一个实现了一个名为的方法包含
用于按顺序搜索数组,确认数组是否包含被请求的元素?
其他的答案都不对
公共布尔值包含(int[] arr, int val) {
For (int I = 0;我< arr.length;我+ +){
If (arr[i] == val) {
返回true;
}
}
返回错误;
}
公共布尔值包含(int[] arr, int val) {
布尔成功;
For (int I = 0;我< = arr.length;我+ +){
If (arr[i] == val) {
成功= true;
其他}{
成功= false;
}
}
返回成功;
}
公共int包含(int[] arr, int val) {
Int success = -1;
For (int I = 0;我< arr.length;我+ +){
If (arr[i] == val) {
成功= val;
}
}
返回成功;
}
公共布尔值包含(int[] arr, int val) {
For (int I = 0;我< arr.length;我+ +){
If (arr[i] != val) {
返回错误;
}
}
返回true;
}
公共布尔值包含(int[] arr, int val) {
For (int I = 0;我< arr.length;我+ +){
If (arr[i] == val) {
返回true;
}
}
返回错误;
}
实现顺序搜索的基本方法是测试数组的每个元素,直到匹配想要查找的值。所有这些可能的答案都非常接近这个结果。它们都遍历给定的数组。他们都会检查价值。但是,有一个选项(带有if-else逻辑)即使找到了元素也可能返回false,因为它在找到之后会继续运行。如果数组中后面的另一个值不匹配,则变量成功
然后会设定为假
.这将返回,表明未找到该值。整数返回方法似乎没有问题,但如果搜索值为- 1,则会产生歧义。在这种情况下,这个返回值不一定表明已经找到了它——它可能只是一个“标志”,表明没有找到任何东西。因此,最简单的方法也是最好的方法:return真正的
只要找到它。
问题21:标准操作和算法
公共静态int foo(int[] arr, int x) {
For (int I = 0;我< arr.length;我+ +){
If (arr[i] == x) {
返回我;
}
}
返回1;
}
给定上面定义的方法,下面的代码会输出多少次单词“doubt !”?
Int [] vals = {1,4,51,3,14,91,130,14};
For (int I = 0;我< 20;我+ +){
If (foo(vals,i%4) < 0) {
System.out.println(“无疑!”);
}
}
没有一个
4
2
5
10
10
为了使这个问题更简单,首先要注意喷火方法实现顺序搜索。(这种搜索只是遍历数组的每个元素,看它是否等于探测值。)如果找到索引,则返回索引。否则,它返回-1。现在,在问题本身的代码块中,循环从i = 0迭代到i = 19。但是,它只会在值0…3上执行搜索。这是因为模数算符。因此,它将做(从0到19),0…3 .共5次。因此,它将探测1和3 5次——它们都在数组中。所以,“doubt !”这个词总共会被输出十次。
例子问题1:搜索
真或假。
顺序搜索比二进制搜索更有效。
假
真正的
假
顺序搜索的运行时间为O(N)。二分查找的运行时间是O(log(N))。因为顺序搜索必须遍历列表中的每个元素至少一次,所以效率较低。
例子问题1:搜索
二叉搜索树的中序遍历和前序遍历的区别是什么?
他们是相似的。
顺序遍历先处理左子树,然后是根节点,然后是右子树,而预订先处理根节点,然后是左子树,然后是右子树。
唯一的区别是in order处理根节点,而preorder不处理。
顺序遍历先处理右子树,然后是根节点,然后是左子树,而预排序先处理左子树,然后是根节点,然后是右子树。
预订搜索从最低到最高的树,而顺序则不是。
顺序遍历先处理左子树,然后是根节点,然后是右子树,而预订先处理根节点,然后是左子树,然后是右子树。
在本例中,名称有助于标识不同类型的遍历。顺序遍历“按顺序”处理二叉树,这意味着它将通过左边的子树,处理节点,然后继续到右边。为什么会这样?因为要记住,二叉排序树列出了左边小于节点的任意值,以及右边大于节点的任意值,所以按顺序遍历实际上是从最大到最小的。
预订遍历与此相同,只是它处理根节点首先,因此才有了“pre”顺序。
例子问题1:搜索
公共静态int foo(int[] arr, int x) {
Int a = 0;
Int b = arr。长度- 1;
While (b >= a) {
Int c = (a + b) / 2;
Int v = arr[c];
If (v == x) {
返回c;
} else if(v < x) {
A = c + 1;
其他}{
B = c - 1;
}
}
返回1;
}
的价值是什么y在下面的代码中:
int[]瓦尔斯={1, 3, 4, 5, 6, 31日,41岁的51个};
intx= 41;
inty= foo (瓦尔斯、41);
5
41
7
-1
6
6
在方法的代码中首先要注意的是喷火它实现了二分搜索的算法。的值c作为算法的中点。这要求列表是有序的。的值一个而且b用于控制循环,以便让您搜索列表的正确部分。如果列表中间的值不等于你要查找的值(例如:x),那么它在列表中看起来不是“上面”就是“下面”(因为它被假定是按顺序排列的)。这就是当任何一个一个或b是改变。
这个搜索值并返回索引号如果找到了该值。否则,它返回-1。因为值41在数组中,所以它返回6。
如果您不能识别这个算法,您可能会遇到一些问题,并且必须跟踪代码!!
例子问题1:搜索
对于二进制搜索算法,下列哪项是正确的?
必须按照从开始到结束的顺序探测数组。
该数组可以未排序,但运行速度会比排序慢。
在搜索之前,必须对被搜索的数组进行排序。
数组需要额外的空间来容纳作为搜索一部分的交换操作。
在搜索值之前,必须将数组转换为二叉搜索树。
在搜索之前,必须对被搜索的数组进行排序。
二分搜索假定被搜索的数组已经排序。这是因为它探测数组中的值的方式。它从数组的中心开始查看值是否匹配。如果该值小于该中心元素,则假定该值位于数组的下半部分。否则,它假定该值必须更大,因此位于数组的上半部分。然后,它探测它所选择的任何一半的中心,继续这样做,直到确定没有找到值。
例子问题1:搜索
二叉搜索树的中序遍历和前序遍历的区别是什么?
他们是相似的。
顺序遍历先处理左子树,然后是根节点,然后是右子树,而预订先处理根节点,然后是左子树,然后是右子树。
唯一的区别是in order处理根节点,而preorder不处理。
顺序遍历先处理右子树,然后是根节点,然后是左子树,而预排序先处理左子树,然后是根节点,然后是右子树。
预订搜索从最低到最高的树,而顺序则不是。
顺序遍历先处理左子树,然后是根节点,然后是右子树,而预订先处理根节点,然后是左子树,然后是右子树。
在本例中,名称有助于标识不同类型的遍历。顺序遍历“按顺序”处理二叉树,这意味着它将通过左边的子树,处理节点,然后继续到右边。为什么会这样?因为要记住,二叉排序树列出了左边小于节点的任意值,以及右边大于节点的任意值,所以按顺序遍历实际上是从最大到最小的。
预订遍历与此相同,只是它处理根节点首先,因此才有了“pre”顺序。
例子问题1:搜索
公共静态int foo(int[] arr, int x) {
Int a = 0;
Int b = arr。长度- 1;
While (b >= a) {
Int c = (a + b) / 2;
Int v = arr[c];
If (v == x) {
返回c;
} else if(v < x) {
A = c + 1;
其他}{
B = c - 1;
}
}
返回1;
}
的价值是什么y在下面的代码中:
int[]瓦尔斯={1, 3, 4, 5, 6, 31日,41岁的51个};
intx= 41;
inty= foo (瓦尔斯、41);
5
41
7
-1
6
6
在方法的代码中首先要注意的是喷火它实现了二分搜索的算法。的值c作为算法的中点。这要求列表是有序的。的值一个而且b用于控制循环,以便让您搜索列表的正确部分。如果列表中间的值不等于你要查找的值(例如:x),那么它在列表中看起来不是“上面”就是“下面”(因为它被假定是按顺序排列的)。这就是当任何一个一个或b是改变。
这个搜索值并返回索引号如果找到了该值。否则,它返回-1。因为值41在数组中,所以它返回6。
如果您不能识别这个算法,您可能会遇到一些问题,并且必须跟踪代码!!
例子问题1:搜索
对于二进制搜索算法,下列哪项是正确的?
必须按照从开始到结束的顺序探测数组。
该数组可以未排序,但运行速度会比排序慢。
在搜索之前,必须对被搜索的数组进行排序。
数组需要额外的空间来容纳作为搜索一部分的交换操作。
在搜索值之前,必须将数组转换为二叉搜索树。
在搜索之前,必须对被搜索的数组进行排序。
二分搜索假定被搜索的数组已经排序。这是因为它探测数组中的值的方式。它从数组的中心开始查看值是否匹配。如果该值小于该中心元素,则假定该值位于数组的下半部分。否则,它假定该值必须更大,因此位于数组的上半部分。然后,它探测它所选择的任何一半的中心,继续这样做,直到确定没有找到值。