【小米校招笔试】一个数组是由有序数组经过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 stub
		find(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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值