题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

用二分查找的方式来查找数组的最小值,这个值是存在于最大值到最小值的转折中,一个指针指向第一个升序子数组的第一个元素,第二个指针指向第二个升序子数组的最后一个元素,确定数组中间的元素,如果是比第一个指针的元素大,则表示中间指针存在第一个升序子序列中,将第一个指针指向中间指针指向的元素,如果中间元素比第二个指针指向的元素小,则表明中间元素存在第二个子序列中,则将第二个指针指向中间元素。
 
测试用例:
1)功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复数字或者没有重复数字)。
2)边界值测试(输入的数组是一个升序排序的数组,只包含一个数字的数组)。
3)特殊输入测试(输入null指针)。

实现代码:

package com.yyq;

import java.util.Arrays;

/**
* Created by Administrator on 2015/9/10.
*/
public class FindMin {
public static int findMin(int[] array){
int len = 0;
int i = 0;
int j = 0;
int mid = 0;
try {
if (array == null || array.equals(" ")) {
throw new Exception("Invalid Parameters");
}
len = array.length;
j = len - 1;
while(array[i] >= array[j]){
if (j - i == 1 || j == i){
mid = j;
break;
}
mid = ( i + j ) / 2;
if (array[i] == array[j] && array[mid] == array[i])
return minInOrder(array,i,j);
if (array[mid] >= array[i])
i = mid;
else if (array[mid] <= array[j])
j = mid;
}
}catch (Exception e){
e.printStackTrace();
}
return array[mid];
}
public static int minInOrder(int[] array,int i, int j){
int result = 0;
for (int m = i + 1; m <= j; m++){
if (result > array[m]){
result = array[m];
}
}
return result;
} // ====================测试代码====================
public static void Test(int[] numbers, int expected)
{
int result = 0;
System.out.println("The resource sequence is:");
System.out.println(Arrays.toString(numbers));
if(numbers == null || numbers.equals(" ")) return;
result = findMin(numbers);
if(result == expected)
System.out.println("The minimum is " + result + ", Passed!");
else
System.out.println("Fail!");
} public static void main(String[] args){
// 典型输入,单调升序的数组的一个旋转
int array1[] = {3, 4, 5, 6, 0, 1, 2};
Test(array1, 0); // 有重复数字,并且重复的数字刚好的最小的数字
int array2[] = {3, 4, 5, 1, 1, 2};
Test(array2, 1); // 有重复数字,但重复的数字不是第一个数字和最后一个数字
int array3[] = {3, 4, 5, 1, 2, 2};
Test(array3, 1); // 有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字
int array4[] = {1, 0, 1, 1, 1};
Test(array4, 0); // 单调升序数组,旋转0个元素,也就是单调升序数组本身
int array5[] = {1, 2, 3, 4, 5};
Test(array5, 1); // 数组中只有一个数字
int array6[] = {2};
Test(array6, 2); // 输入NULL
Test(null, 0);
}
}
输出结果:
The resource sequence is:
[3, 4, 5, 6, 0, 1, 2]
The minimum is 0, Passed!
The resource sequence is:
[3, 4, 5, 1, 1, 2]
The minimum is 1, Passed!
The resource sequence is:
[3, 4, 5, 1, 2, 2]
The minimum is 1, Passed!
The resource sequence is:
[1, 0, 1, 1, 1]
The minimum is 0, Passed!
The resource sequence is:
[1, 2, 3, 4, 5]
The minimum is 1, Passed!
The resource sequence is:
[2]
The minimum is 2, Passed!
The resource sequence is:
null

P66、面试题8:旋转数组的最小数字的更多相关文章

  1. 【剑指offer】面试题 11. 旋转数组的最小数字

    面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  2. 剑指offer编程题Java实现——面试题8旋转数组的最小数字

    剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1, ...

  3. 剑指offer-面试题8.旋转数组的最小数字

    题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  4. 【剑指Offer】面试题11. 旋转数组的最小数字

    题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个 ...

  5. 《剑指offer》面试题11. 旋转数组的最小数字

    问题描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...

  6. 《剑指offer》面试题8—旋转数组的最小数字

    题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转.要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字.例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的 ...

  7. 《剑指offer》面试题8 旋转数组的最小数字 Java版

    (找递增排序旋转数组中的最小数字) 书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写.旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一 ...

  8. 《剑指offer》第十一题(旋转数组的最小数字)

    // 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...

  9. 剑指offer——面试题11:旋转数组的最小数字

    #include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...

  10. 剑指Offer面试题:7.旋转数组的最小数字

    一.题目:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2 ...

随机推荐

  1. 6款好用的Python IDE

    “工欲善其事,必先利其器”,如果说编程是程序员的手艺,那么IDE就是程序员吃饭的家伙了.一个优秀的IDE,最重要的就是在普通文本编辑之外,提供针对特定语言的各种快捷编辑功能,让程序员尽可能快捷.舒适. ...

  2. html的3要素

    在HTML标记语言中可以将每个网页源码分成3部分: 1.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" &q ...

  3. CSS3.0动画之hover---Y轴----3D旋转

    div#div2{display: table; width: 100%; height: 100%; text-decoration: none; outline: none; -webkit-tr ...

  4. javascript实现URL不缓存的方法

    <script> document.write("<s"+"cript type='text/javascript' src='/js/test.js? ...

  5. Django文档——Model字段选项(Field Options)

    建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), (2,'Female'), ) name=models.Cha ...

  6. 在emacs里用w3m浏览网页

    给w3m配置个~/.emacs老是暴错误,在配置里把这个注掉就OK了;(require 'mime-w3m) ;;支持w3m (add-to-list 'load-path "/usr/sh ...

  7. JS 判断一个字符串是否包含在一个数组中

    var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...

  8. 【BZOJ 3171】 [Tjoi2013]循环格

    Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格 ...

  9. 在树莓派上 搭建sqlite数据库

    最近找工作需要学习一些数据库方面的知识,所以就在实验室的树莓派上准备装个数据库试试,刚开始准备装一个mysql数据库,出现了很多问题,放弃了,后来查了一些资料原来还有很多可以用的小巧实用的数据库,sq ...

  10. Microsoft .NET Framework 4.0安装时发生严重错误 无法安装

    前几天安装Axure,电脑提示没有安装.NET Framework4.0,然后下载安装,又提示如下图所示情况: 在网上找了好多方法,大多都是打开cmd,输入net stop WuAuServ,修改注册 ...