/** * @author niuxd * @title: Test * @date 2020/7/14 12:45 */ public class Test { public static void main(String[] args) { int[] arr = {6, 9, 1, 5, 9, 4, 2}; //查找第k小的奇数 String kStr = "2"; int k ; try{ k=Integer.parseInt(kStr); if(k<=0){ System.out.println("参数k应为正整数"); System.exit(-1); } //如果参数k超过数组长度,需要返回值,可以注释掉这几行 if(k>arr.length){ System.out.println("参数k超过数组长度"); System.exit(-1); } Test test = new Test(); int number = test.findKth(arr, k); System.out.println("第"+k+"小的数是:"+number); }catch (ArrayIndexOutOfBoundsException aioe){ System.out.println("请输入参数k"); System.exit(-1); }catch (NumberFormatException nfe){ System.out.println("参数k应为正整数"); System.exit(-1); } } /** * 查找数组arr中第k小的奇数,如果不存在则返回0 * @param array 数组 * @param k 第k位 * @return */ private int findKth(int[] array, int k) { //1、先进行排序,二分法,复杂度为O(nlogn) mergeSort(array, 0, array.length - 1); //2、查找第k小的数 //index用于计数,第几个数值 int index = 1; for (int i = 0;i<array.length;i++){ //找奇数 if (array[i]%2!=0){ //找到第k小/大的数据则返回 if (index==k){ return array[i]; } //继续查找直至第k小/大 index++; } } //3、没找到返回 0 return 0; } /** * 通过二分法进行排序 */ public void mergeSort(int[] array, int left, int right) { if (left >= right) { return; } int mid = left + (right - left) / 2; mergeSort(array, left, mid); mergeSort(array, mid + 1, right); merge(array, left, mid, right); } /** * 分为一组一组进行对比,放入临时容器中,排序完成后更新数组 */ private void merge(int[] array, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int leftPos = left; int rightPos = mid + 1; int tempPos = 0; while (leftPos <= mid && rightPos <= right) { if (array[leftPos] <= array[rightPos]) { temp[tempPos++] = array[leftPos++]; } else { temp[tempPos++] = array[rightPos++]; } } if (leftPos > mid) { while (rightPos <= right) { temp[tempPos++] = array[rightPos++]; } } else { while (leftPos <= mid) { temp[tempPos++] = array[leftPos++]; } } for (int i = 0; i < temp.length; i++) { array[i + left] = temp[i]; } } }
相关推荐
在C++编程中,查找数组中的第二大和第二小的数值以及重复次数最高的数是一项常见的算法问题,这涉及到数组处理和排序。以下将详细介绍如何通过C++来实现这一功能。 首先,我们要解决的是找到数组中的第二大和第二小...
二分查找将数组分成两半,每次比较中间元素,直到找到目标或确定目标不存在。不过,这个题目没有提及排序,所以我们将重点放在基本的线性搜索上。 为了在实际的C++程序中使用这个查找功能,你需要先定义数组,然后...
在同时携带第二个数组arr 2的同时,按升序对数组arr 1进行排序通常是有用的。在这样的排序中,每次数组arr 1的元素与arr 1的另一个元素交换时,数组arr 2的对应元素也被交换。当排序结束时,数组arr 1的元素按升序...
12有一个数组arr,其中只有一种数出现了K次,其余所有的数都都出现了M次。
如果没有找到,则返回一个特定值(通常为-1),表示元素不在数组中。 #### 二、Java中的线性查找实现 在给定的代码片段中,我们看到了一种称为“线性查找”或“顺序查找”的方法。这是一种非常直观的查找方式,...
已知一个有序数组arr,和一个数字num。返回数组中是否含有这个数字。(使用二分法)
如果序列中不存在目标值,则返回一个表示未找到的特殊值。在C语言中,顺序查找的实现通常涉及一个循环结构,如下: ```c #include int linear_search(int arr[], int n, int target) { for (int i = 0; i ; i++)...
话不多说,下面就跟着小编来看下利用jquery实现删除数组中重复元素的具体思路吧 首先定义如下数组: var arr=[0,2,3,5,6,9,2]; 我们可以看到数组中... //判断元素是否存在于new_arr中,如果不存在则插入到new_arr的
例如,对于数组`[2,4,5,6,7,0,9,10,15,1]`,`mathMin`函数会返回0,因为0是数组中的最小值。 接下来是查找数组中最大值的函数`mathMax`,其工作原理与`mathMin`类似,但比较的是元素是否大于当前最大值`max`。同样...
二维数组arr与二级指针**arr 个人误区
首先,我们可以将数组中每个元素及其索引存入哈希表,然后遍历数组,对于每个元素`arr[i]`,我们可以尝试在哈希表中查找`target - arr[i]`,如果找到,则增加计数。这种方法的时间复杂度降低到了O(n)。以下是哈希表...
1. 首先,检查数组的大小是否小于3,如果是,则不可能存在连续三个奇数,直接返回`false`。 2. 使用一个`for`循环遍历数组,从第一个元素到倒数第二个元素(因为我们要检查连续三个元素,所以不能超过数组长度减2)...
数组查找通常涉及到定位数组中的某个特定元素。C#提供了多种查找方法: 1. 线性查找(顺序查找):是最简单的查找方法,遍历数组直到找到目标元素或遍历完数组。虽然效率较低,但适用于小规模或未排序的数组。 ```...
5. 重复步骤1至4,直到左边界大于右边界,表示目标值不存在于数组中,返回-1。 在JavaScript中实现二分查找的代码可能如下: ```javascript function binarySearch(arr, target) { let left = 0; let right = ...
接着,我们来看核心的`countElement`方法,它接受一个整数数组`arr`和一个目标整数`target`作为参数,返回目标元素在数组中出现的次数。在方法中,我们初始化一个变量`count`为0,用于累计目标元素出现的次数。然后...
在Python编程中,查找数组中最接近某个特定值的元素是一项常见的任务,这在数据分析、算法设计和各种软件应用中都有广泛的应用。这个任务通常涉及到数组处理和比较操作,可以使用多种方法来实现。以下是一些关于如何...
如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样在这一半的中间元素开始。在Java中,你可以通过递归或循环实现二分查找。 5. **Test1.java**:这可能是一个实现上述功能的Java...
### Java编程经典案例分析:“查找数组最小值,并将数组扩容成新数组” #### 背景与目标 在本案例中,我们通过一个具体的Java程序来实现以下功能: 1. **随机生成一个包含10个元素(每个元素的取值范围为0到100...
Java按规律插入数据,这是Java版的例子,而非此前网上的C 例子。有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。这是实现这一算法的具体代码: ... //将数组arr中的元素按升序排列