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次循环移动后所得,请你用最快速度查找某个元素位置相关推荐

  1. 【小米校招笔试】在Excel中,列的名称是这样一个递增序列:seq={A、B、C、... Z、AA、AB、AC、... AZ、BA、BB、BC、... BZ、CA、... ZZ、AAA、AAB...

    2016年小米校招笔试第一题(成都站) 1 在Excel中,列的名称是这样一个递增序列:seq={A.B.C....  Z.AA.AB.AC.... AZ.BA.BB.BC.... BZ.CA.... ...

  2. 【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。

    2016年小米校招笔试第三题(西安站) 3 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共 ...

  3. 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

    2016年小米校招笔试第一题(西安站) 1 给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次. 参考解法(Java版): package XiaoMi;/********** ...

  4. append 降低数组位数_4.有序数组

    果然我在这个专栏的更新上没有压力,哈哈,这挺好的,不用在乎别人是不是看,反正自己总结出来,巩固了知识就好. 有序数组其实就是数组的进化版,和数组唯一的区别就是"有序"这两个字,就是 ...

  5. code第一部分数组:从有序数组中移除重复的数据

    code第一部分数组:从有序数组中移除重复的数据 第二题 从有序数组中移除重复的数据,但是可以保留2个重复的数. For example, Given sorted array A = [1,1,1, ...

  6. 腾讯实习笔试:关于几个有序数组求交集的问题

    题目就是假设有三个有序数组对其求交集,要求算法空间复杂度必须小,有序数组量会比较大. 解法: 第一种就是用二分法查找,二分法查找的效率是log(n),两个数组求交集就是n1log(n2),当n1远小于 ...

  7. 【IT笔试面试题整理】有序数组生成最小高度二叉树

    [试题描述]定义一个函数,输入一个有序数组生成最小高度二叉树 We will try to create a binary tree such that for each node, the numb ...

  8. 【代码随想录训练营】【Day02】第一章|数组|977.有序数组的平方|209.长度最小的子数组|59.螺旋矩阵II|总结

    977. 有序数组的平方 题目详细:LeetCode.977 解这道题的思路和方法有很多,最简单的方法就是计算出数组中每个元素的平方数,并记录在新数组中,最后对新数组进行排序即可得到答案,但这个方法效 ...

  9. JavaScript习题(数组去重、有序数组乱序排列)

    数组去重 Array.prototype.unique = function(){var temp = {},arr = [],len = this.length;for(var i = 0 ; i ...

最新文章

  1. SSH实现论坛BBS系统
  2. 非对称加密,我终于理解了!
  3. webpack基础概念
  4. 【Vue案例一】实现跑马灯效果
  5. edxp显示未安装_智能水表安装使用注意事项
  6. [elixir! #0016] 在 phoenix 项目里配置 elm
  7. 使用MMS(MongoDB Monitoring Service)监控MongoDB
  8. XPO学习(3)----数据查询
  9. stl之list双向链表容器应用基础
  10. DELPHIER,正转向PYTHON了
  11. 流程图介绍 以及工具推荐
  12. Oracle 11g Rac搭建
  13. UG NX重用库汉化版本
  14. android11 前摄相头隐藏闪光灯图标
  15. 一切过往皆序章,一切未来皆可期——2021给自己定个小目标:读完52本书
  16. 使用matlab建立个人简历,HTML 使用表格制作简单的个人简历
  17. C++ 并发指南<future>(2)std::packaged_task
  18. Historian 7.0 安装说明
  19. python写几个好玩的程序_怎么用python编写好玩的程序
  20. 直角杨辉三角形(C)

热门文章

  1. 如何科学地完成一场 AR 发布会?
  2. 学霸君袁荣喜:K12一对一辅导,这是一个收割的时代| MCtalk教育访谈摘录
  3. 网易云信为你的互联网应用快速接入直播功能
  4. SpringMVC默认欢迎页面的问题
  5. Java Learning Path(四) 方法篇
  6. expandableListView 总结
  7. zend 修改默认view路径,添加扩展view
  8. 在VS2010中配制Elmah邮件发送到Gmail
  9. Ruby之旅—Ruby的Hello World
  10. PaddleHub人像分割模型:AI人像抠图及图像合成