當前位置:
首頁 >
【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
發布時間:2025/1/21
56
豆豆
生活随笔
收集整理的這篇文章主要介紹了
【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2016年小米校招筆試第二題(西安站)
2 現有一個數組是由有序數組經過n次循環移動后所得,請你用最快速度查找某個元素位置(如1234568,向右移動3次后為67812345)。
參考解法(Java版):
看題后第一直覺可能想去遍歷數組,那么時間復雜度為o(n),不夠高效。下面提供另一種參考方法。
package XiaoMi; /********************************************************* 解題思路:首先找到轉折點,從轉折點截斷,原數組分成兩個有序數組;* 再利用二分查找對兩段分別查找,最終返回查找結果。其中,對二分查* 找算法做了一些改進,加了兩個起始位、結束位兩個參數,使用中更方便。* *****************************************************/ import java.util.Arrays;public class test14 {/*** @param args*/private final static String str = "67812345";public static void main(String[] args) {// TODO Auto-generated method stubfind(str, 3);}public static int find(String str, int in) {// 將String輸入轉換為int數組char[] chars = str.toCharArray();int[] ints = new int[chars.length];int i = 0;for (char x : chars) {//ints[i] = Integer.valueOf(x);ints[i] =Integer.parseInt(x+""); //字符串轉int型//System.out.println(ints[i]);++i;}// 查找排序轉折點int j = 0;while (!(ints[j] >= ints[j + 1])) {++j;}// 將數組從轉折點截為兩段有序數組,再運用二分查找int loc =0;if (in > ints[ints.length - 1]) { // 在左邊loc =binarySearch(ints, in, 0, j);} else { // 在右邊loc =binarySearch(ints, in, j+1, ints.length - 1);}System.out.println(loc);return 0;}// 改進二分查找public static int binarySearch(int[] src, int des, int start, int end) {int low = start;int high = end;while ((low <= high)){int middle = low + ((high - low) >> 1);if (des == src[middle]) {return middle;} else if (des < src[middle]) {high = middle - 1;} else {low = middle + 1;}}return -1;} } 運行結果:
5
總結
以上是生活随笔為你收集整理的【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小米校招笔试】给定一些线段,线段有起点
- 下一篇: 【小米校招笔试】假如已知有n个人和m对好