题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用二分法解,我想起了大概的思路,但是写不出完整的代码.所以,算法题还是要多刷几遍才行呀,要熟悉解题思路和实现的代码. 这道题给了一个升序数组,一种情况是目标数字出现了至少一次,另外一种情况是目标数字不存在. 没想到的解法  二分 给目标数字集合定义一个上边界和一个下边界. 下边界:升序数组中出现的第一个目标数字…
剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次.请找出数组中任意一个重复的数字. Input: {2, 3, 1, 0, 2, 5} Output: 2 解题思路 要求时间复杂度 O(N),空间复杂度 O(1).因此不能使用排序的方法,也不能使用额外的标记数组. 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第…
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0.   我的理解 找到数组中超过一半的数,即众数.设置一个变量tmp保存当前假设认为是众数的数,设置cnt保存tmp未被抵消的次数.遍历数组,若当前数字不是tmp,则cnt--:若当前数字是tmp,则cnt++:若cnt=0,则tmp换成下一个数字. 这是时间复杂度为O(n),空间…
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2.   我的想法 最开始想到的是用"字典",依次记录每个数字出现的次数,这就要遍历数组并且创建字典,感觉空间上占用较大. # -*- coding:utf-8 -*- class Solution: # 这里要特别注…
构建乘积数组 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不能使用除法.(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];) 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在. 难度:简单 我的回答 # -*- coding:u…
一.题目:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 二.解题思路 2.1 直接运用二分查找 既然输入的数组是排序的,那么我们很自然地就能想到用二分查找算法.在题目给出的例子中,我们可以先用二分查找算法找到一个3.由于3可能出现多次,因此我们找到的3的左右两边可能都有3,于是我们在找到的3的左右两边顺序扫描,分别找出第一个3和最后一个3.因为要查找的数字在长度为n的数…
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 我的想法 斐波那契数列定义:F(0)=0,F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) 创建一个初始数组nums,大小为n+1,定义nums[0]=0, nums[1]=1, nums[2]=1. 从nums[3]开始依次以前两位数相加得到计算结果,直到得到nums[n],返回该结果. # -*- co…
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using namespace std; int GetFirstK(vector<int>& nums, int startpos, int endpos, int k) { if(startpos > endpos) ; ; if(nums[mid] == k) { || (mid >…
<剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. 用两个栈实现队列 面试题10- I. 斐波那契数列 面试题10- II. 青蛙跳台阶问题 面试题11. 旋转数组的最小数字 面试题12. 矩阵中的路径 面试题13. 机器人的运动范围 面试题14- I. 剪绳子 面试题14- II. 剪绳子 II 面试题15. 二进制中1的个数 面试题16. 数值的整数次方…
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h…
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中倒数第k个结点 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2159解决:958 题目描写叙述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包括多个測试例子.输入以EOF结束. 对于每一个測试案例.输入的第一行为两个整数n和k(0<=n<…
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:…
简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leetcode上的<剑指offer>专题的链接如下:剑指 Offer(第 2 版)-力扣 下面名字后标 ★ 的题目是我在整理时认为需要重点掌握与复习的题目.未标星的题目并非不重要,而是相对简单,不需要再额外进行重点复习. 目录 03. 数组中重复的数字 04. 二维数组中的查找 05. 替换空格 06.…
一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采用的是二分幂思想,当然也可以采用快速幂. 更具剑指offer书中细节,该题的解题思路如下: 1.当底数为0且指数<0时,会出现对0求倒数的情况,需进行错误处理,设置一个全局变量: 2.判断底数是否等于0,由于base为double型,所以不能直接用==判断 3.优化求幂函数(二分幂). 当n为偶数,…
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内. 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 输出 输入:[0,1,2,4] 输出:3 解法1: 暴力枚举法 直接进行一遍遍历就可以,如果发现不符合条件(就是下标不等于数值),一定是第一个不符合的. AC代码如下: class Solution { public: int getMissingNumber(vector<int>& nums) { int i…
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4 样例输出: [解题思路]本题还是有一定的难度的,首先我们不可能通过遍历的方案来完成,时间复杂度过高.然…
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 @author: Administrator 题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: step1:采用递归中序遍历的方式,将值放在列表中 step2:遍历将其转换成双向链表 """ c…
leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<}; ;i <= num;i++){ == ) result.push_back(result[i/]); else result.…
说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode,突然看见一个大神研究生正在刷这个系列,故跟着大神学习. 4.在别人基础之上进行部分优化,总结自己的观点. 问题: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 现在有这样一个问题 ,num=…
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 输入: 输入有多组数据,每组测试数据为一行. 每一行有两个整数a,b(…
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l".如果当前字符流没有存在出现一次的字符,返回#字符. 思路 和前面的那道字符串中只出现一次的字符相似而不相同,前面那道是固定长度字符串,而本题是字符流,也就是会增长的,每次字符串多一个字符,就要重新判断是哪个只出现一次的…
题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素. 输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素. 输出: 对应每个测试案例, 若有结果,输出相应的查找结果.否则,输出NULL. 样例输入: 5…
剑指 Offer 09. 用两个栈实现队列 题目链接 class CQueue { private Stack<Integer> sta1; private Stack<Integer> sta2; public CQueue() { sta1 = new Stack<>(); sta2 = new Stack<>(); } public void appendTail(int value) { while(!sta1.empty()){ sta2.push…
一.题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 二.思路 解法一: 数组排序后,如果符合条件的数存在,则一定是数组中间那个数.(比如:1,2,2,2,3:或2,2,2,3,4:或2,3,4,4,4等等). 解法二: 采用阵地攻守的思想: (1)第一个数字作为第一个士兵,守阵地:count = 1: (2)遇到相同元素,cou…
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0] 设置为返回结果.. 一 . 题目分析 题目说的太笼统,举例分析. 例如:给定的数组是这个:int[] z = new int[8] {2,4,3,6,3,2,5,5 };  因为2/3/5都有两个,所以输出的是num1[0]=4: num2[0]=6.. 分析步骤: 1 . 遍历数组 + 遍历内…
题目:一个整型数组里除了两个数字之外.其它的数字都出现了两次,请敲代码找出这两个仅仅出现一次的数字. 要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 比如输入数组{2, 4, 3, 6, 3, 2, 5 },由于仅仅有4 .6 这两个数字仅仅出现一次,其它数字都出现了两次,所以输出4和6 . 解题思路 这两个题目都在强调一个(或两个)数字仅仅出现一次,其它的出现两次. 这有什么意义呢?我们想到异或运算的一个性质:不论什么一个数字异或它自己都等于0.也就是说. 假设我们从头到尾依次异或…
数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190 参与人数:2597    时间限制:1秒   空间限制:32768K 本题知识点: 数组 题目描述 统计一个数字在已排序数组中出现的次数. 样例输入: 2 3 3 3 3 4 51 3 6,5,3,3,1,0 3 样例输出: 4 2 分析:      数字在排序数组中出现的次数,首先想到…
// 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}.由于数字2在数组中 // 出现了5次,超过数组长度的一半,因此输出2. #include <iostream> using namespace std; /*Random Partition*/ int RandomInRange(int min, int max) { ) + min…
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class 二维数组中的查找 { /* * 最初反应是遍历一遍,但是数组从左到右和从上到下都是递增的,那么可以把二维数组的右上角 * 作为初始比较位置.比如从右上角开始,假设右上角的数为x,输入数值为y.如果y<x,那就直接往左找,如果 y>x,就向下一行. */ public stat…
问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0   限制: 0 <= 数组长度 <= 50000 代码 class Solution { public: int search(vector<int>& nums, int target) { int n = nums.size(…