面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. Java 实现 复杂度:O(logN) + O(1) public class Solution { public int minNumberInRotateArray…
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1.   示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 思路一:暴力 代码 时间复杂度:O(n) 空间复杂度:O(1) class Solution { public: int minArray(vector<int>…
问题描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1.   示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 代码 class Solution { public: int minArray(vector<int>& numbers) { int n = nu…
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数字的最小值为1. 测试用例: 功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复数字或者没有重复数字). 边界值测试(输入的数组是一个升序排序的数组,只包含一个数字的数组). 特殊输入测试(输入nullptr指针). 测试代码: void Test(int* numbers…
题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转.要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字.例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1. 思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点.由于是局部有序的,想到用二分查找的方法去查找最小元素.和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面:如果该数小于index2,则说明最小数在该数前面或者就是该数. 例外情况:1.…
(找递增排序旋转数组中的最小数字) 书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写.旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一个元素小,表示在第二段递增序列里.这样就可以用递归或迭代完成.需要注意的一点是如果中间元素和第一个元素相等,并且和最后一个元素也相等,这时候我们判断不出这个元素是在第一个递增序列里还是在第二个递增序列里,这时候要从头到尾扫描来确定最小元素了.需要注意的另外一点是数组可能是没有旋转的,即把前面0个元素…
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0.   最简单的为遍历整个数组,找出最小的数,不过这是最笨的办法   解题主要是用二分查找,不过二分查找也有的复杂度过高的情况   以下的结果时间复杂度过高:不通过       public int minNumbe…
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 分析:因为有序,可以使用二分查找,但有特殊情况,比如{1,0,1,1,1}{1,1,1,0,1}都是{0,1,1,1,1}的旋转,使用二分查找时无法分辨0所在的位置是在前半段还是后半段,只能用顺序查找. public…
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含查找的数字(查找的数字是数组中的最大值和最小值:查找的数字介于数组中的最大值和最小值之间). 二维数组中没有查找的数字(查找的数字大于数组中的最大值:查找的数字小于数组中的最小值:查找的数字在数组的最大值和最小值之间但数组中没有这个数字). 特殊输入测试(输入空指针). 测试代码: /* ***数字…
问题描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.   示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459"   提示: 0 < nums.length <= 100 说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0 代码 class Solution {…
题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3. 测试用例: 长度为n的数组里包含一个或多个重复的数字. 数组中不包含重复的数字. 无效输入测试用例(输入空指针:长度为n的数组中包含0~n-1之外的数字) 测试代码: void test(cha…
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1. 示例一 输入:[3,4,5,1,2] 输出:1 示例二 输入:[2,2,2,0,1] 输出:0 class Solution { public int minArray(int[] numbers…
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1. 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 方法1:使用自带的sort函数,对数组进行排序,然后取出第一个数值 class Solution { public: int…
剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1 旋转数组的特点: 1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素. 2,最小或者最大元素位于两个子数组的分界 解题思路:在排序数组中,可以使用二分查找法进行查找 利用左右两个指针和中间指针元素大…
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 解题思路: 1.暴力解法,从头到尾遍历一次,我们就能找出最小的元素,复杂度为O(n),但是没有利用输入的旋转数组的特性,肯定达不到面试官的要求. 2.二分查找,这里的数组可以看成两个有序的子数组,二分查找对有序数组非常有效,复杂度为O(logn). 具体分析: 1.先分析数组的特点…
面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 函数,同时不需要考虑大数问题 看起来这道题是一道很简单的题目,不需要什么算法思想,<剑指offer>书中循序渐进讲解了3种方 法,指出可能会出现的问题 方法一 直接使用for循环解决问题 public static double power_method_1(double base,int exp…
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1. 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 说明 Java public class Solution11 { public static void main(String[] args) { Solutio…
题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该 数组的最小值为1. 这道题可以使用类似于二分查找的思想,算法思路如下: 1.假设有一个旋转数组A,我们设两个索引p1,p2 2.p1指向为数组第一个元素,p2指向为数组最后一个元素 3.取p3为数组中的中间元素 4.比较p3指向的元素与p1,p2.若p3>p1,则说明前半个    子数组为递增数…
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=…
面试题 57. 和为 S 的两个数字 题目一:和为 S 的两个数字 题目 输入一个递增排序的数组和一个数字 S,在数组中查找两个数,是的他们的和正好是 S,如果有多对数字的和等于 S, 输出两个数的乘积最小的. 思路 数列满足递增,设两个头尾两个指针 i 和 j, 若 ai + aj == sum,就是答案(相差越远乘积越小) 若 ai + aj > sum,aj 肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若 ai + aj < sum,ai 肯定不是答案之一(前面…
面试题 21. 调整数组顺序使奇数位于偶数前面…
题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> using namespace std; class Singleton { public: static Singleton* getInstance() { if(m_pInstance == nullptr) { m_pInstance = new Singleton(); } return m_pInsta…
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). 特殊二叉树(所有节点都没有右子节点的二叉树:所有节点都没有左子节点的二叉树:只有一个节点的二叉树:二叉树的根节点指针为nullptr). 不同位置的节点的下一个节点(下一个节点为当前节点的右子节点.右子树的最左子节点.父节点.跨层的父节点等:当前节点没有下一个节点). 测试代码: void Tes…
题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 看题目似乎很简单,循环相乘不就行了吗?不是的. 需要考虑几个问题: 1.exponent为0或者负数: 2.base为0且exponent为负数,其中判断base是否为0,需要考虑base为double类型: 3.高效的计算方法:分治: 代码: #include <iostream> #include <stdlib.h> using namespace…
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; }; 注意点: 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this).只有返回一个引用,才可以允许连续赋值.否则,如果函数的返…
题目:请实现一个函数,把字符串中的每个空格替换成"20%".例如,输入"We are happy."则输出"We%20are%20happy.". 注意:看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'.'2'和'0'这3个字符,因此字符串会边长.如果是在原来的字符串上进行替换,就有可能覆盖修改在该字符串后面的内存.如果是创建新的字符串并在新的字符串上进行替换,那么我们可以自己分配足够多的内存.由于有两种不同的解决方案,我们…
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值.链表节点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext; } 测试用例: 功能测试(输入的链表有多个节点:输入的链表只有一个节点). 特殊输入测试(输入的链表头结点指针为nullptr). 测试代码: void Test(ListNode* pHead) { PrintList(pHead); PrintListReversingly_Iteratively(pHead); p…
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5 3, 8, 6},则重建如下图所示的二叉树并输出它的头结点.二叉树的节点的定义如下: struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; /…
题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在尾部插入节点和在队列头部删除节点的功能. 测试用例: 往空的队列里添加.删除元素. 往非空的队列里添加.删除元素. 连续删除元素直至队列为空. 测试代码: void test(char actual, char expected){ if(actual == expected) printf("test passed.\n"); else printf("tes…
题目:求斐波那契数列的第n项.写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下:f(0) = 0, f(1) = 1,f(n) = f(n - 1) + f(n - 2). 测试用例: 功能测试(如输入3.5.10等). 边界值测试(如输入0.1.2). 性能测试(输入较大的数字,如40.50.100等). 测试代码: void test(int n, int expected){ if(fibonacci_solution1(n) == expected) printf("t…