![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指Offer
牛客剑指Offer
error0318
这个作者很懒,什么都没留下…
展开
-
数组和链表的对比
数组: 优点: 元素在内存中连续存储,查找效率高。 缺点: 在存储之前,需要预先申请内存空间。 在运行过程中,无法动态申请空间。如果数据量小,造成内存浪费。如果数据量大,造成内存溢出 在修改和删除操作时,效率低 应用场景: 数据量可控。偏向查询操作。构建线性表稳定链表: 优点: 内存动态分配。 数据类型多样化 修改和删除操作灵活 ...原创 2020-10-17 17:40:03 · 90 阅读 · 0 评论 -
剑指Offer编程题---翻转单词顺序列
题目链接:翻转单词顺序列题意:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 解题思路: 先将单词分离出来,然后进行拼接就行class Solution {...原创 2020-09-16 18:04:27 · 106 阅读 · 0 评论 -
剑指Offer编程题---把字符串转换成整数
题目链接:把字符串转换成整数题意:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0解题思路: 判断首位元素是否为 + - ,然后遍历字符串,组成数字,如果有其他元素,直接返回0class Solution {public: int StrToInt(string str) { ...原创 2020-09-16 17:38:03 · 150 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
题目链接:剑指 Offer 18. 删除链表的节点题意:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.解题思路: 就两个指针,如果出现就将那个节点代替掉/** * Definiti...原创 2020-09-16 14:55:29 · 153 阅读 · 0 评论 -
十大排序之堆排序
堆排序 : 详情点击<?phpfunction heapSort($a){ $n = count($a); if($n < 2) { return $a; } for($i = intval($n/2)-1; $i >= 0; $i--) { downAdjust($a, $i, $n); } for($i = $n-1; $i > 0; $i--) { $t = $a[$i]; $a[$i] = $a[0]; $a[0] = $t;原创 2020-08-27 19:21:48 · 115 阅读 · 0 评论 -
十大排序之基数排序
基数排序先根据个位数排序,然后十位,然后.....<?phpfunction bucketSort($a){ $max = max($a); $loop = strlen($max); for($i = 1; $i <= $loop; $i++) { R_Sort($a, $i); } return $a;}function R_Sort(array &$arr,$loop){ $tempArr = arr.原创 2020-08-27 13:45:13 · 94 阅读 · 0 评论 -
十大排序之桶排序
相比较计数排序,桶排序是将某个区间的数分配在一个桶中,而不是一个数一个桶然后对桶内的元素进行排序(此处我采用插入排序)最后输出就行<?phpfunction bucketSort($a){ $len = count($a); $ans = array(); for($i = 0; $i < $len; $i++) { $b = intval($a[$i] / 10); if(!isset($ans[$b])) {原创 2020-08-27 10:45:03 · 129 阅读 · 0 评论 -
十大排序之计数排序
计数排序,统计每个数出现的次数<?php$a = array(2,13,20,7,5,2,6,5,8,7,6,6,5,5,4,6,8,3);function countSort($a) { $len = count($a); $t = $arr = array(); for($i = 0; $i < $len; $i++) { if(isset($t[$a[$i]])){ $t[$a[$i]]++; } e原创 2020-08-21 16:51:40 · 91 阅读 · 0 评论 -
十大排序之快速排序
快速排序<?php$a = array(2,13,42,34,56,23,67,365,87665,54,68,3);function quickSort($a) { $len = count($a); if($len < 2) { return $a; } $left = $right = array(); $m = $a[0]; for($i = 1; $i < $len; $i++) { if(原创 2020-08-21 15:46:54 · 119 阅读 · 0 评论 -
十大排序之归并排序
归并排序:归并思想<?phpclass Solution { function mergeSort(&$arr, $start, $end) { if($start >= $end) { return ; } $mid = intval(($start + $end) / 2); $this->mergeSort($arr, $start, $mid); $.原创 2020-08-21 11:46:48 · 87 阅读 · 0 评论 -
十大排序之希尔排序
希尔排序改进版的插入排序思想理解注意:分组后,不是先将一组排序完成再排下一组,而是按照初始数组顺序代码 <?phpclass Solution { function shellSort($arr) { $len = count($arr); for($gap = $len >>2 ; $gap > 0; $gap = intval($gap/2)) { for($i = $gap; ...原创 2020-08-21 09:18:56 · 101 阅读 · 0 评论 -
十大排序之插入排序
插入排序: 将未排序的元素依次插入到排好序的队列里。(从后往前插)<?phpclass Solution { function mySort($arr){ $len = count($arr); for($i = 0; $i < $len - 1; $i++){ if($arr[$i+1] < $arr[$i]){ $t = $arr[$i+1]; // 将最小的取出.原创 2020-08-18 07:34:15 · 127 阅读 · 0 评论 -
十大排序之选择排序
选择排序: 顾名思义,就是选择最大或者最小的元素,依次排放<?phpclass Solution { function mySort($arr){ $len = count($arr); for($i = 0; $i < $len - 1; $i++){ $k = $i; $min = $arr[$i]; // 定义未排序的最小元素 for($j = $i + 1; ..原创 2020-08-18 06:45:02 · 85 阅读 · 0 评论 -
十大排序之冒泡排序
简单排序算法核心思想是将相邻的两个元素在顺序不同的时候交换位置<?phpclass Solution { function mySort($arr){ $len = count($arr); for($i = 0; $i < $len - 1; $i++){ for($j = 0; $j < $len - 1; $j++){ if($arr[$j] > $arr[$j+1]){原创 2020-08-18 06:24:42 · 103 阅读 · 0 评论 -
插入排序
思想: 就是从前往后将每个数字插入到适合他们的位置15 89 363 78 14 65 4715 89 363 78 14 65 4715 89 363 78 14 65 4715 78 89 363 14 65 4714 15 78 89 363 65 4714 15 65 78 89 363 4714 15 47 65 78 89 363#include&l...原创 2020-07-10 16:45:49 · 84 阅读 · 0 评论 -
剑指Offer编程题--旋转数组的最小数字
题目链接:旋转数组的最小数字题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路: 没必要旋转,直接返回答案就行class Solution {public: int minNumberInRotateArray(vector<in.原创 2020-06-09 23:53:30 · 125 阅读 · 0 评论 -
剑指Offer编程题---斐波那契数列
题目链接:斐波那契数列题意:斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39解题思路:直接模拟class Solution {public: int Fibonacci(int n) { int f1 = 0, f2 = 1; if(n <= 0){ return 0; } else if(n == 1){原创 2020-06-09 23:48:13 · 185 阅读 · 0 评论 -
剑指Offer编程题--跳台阶
题目链接:跳台阶题意:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路: 如果青蛙最后跳一节,那么它的方法数为:jumpFloor(n - 1) 如果青蛙最后跳二节,那么它的方法数为:jumpFloor(n - 2)加起来即为总方法数class Solution {public: int jumpFloor(int number) { int f1 = 1, f2 = ...原创 2020-06-09 23:45:31 · 129 阅读 · 0 评论 -
剑指Offer编程题--矩形覆盖
题目链接:矩形覆盖题意:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:将一个问题缩小化,分治法如果占用最右边的一列,那么方法数为 rectCover(n-1)如果占用最右边的两排,那么方法数为 rectCover(n-2)加起来即为总数class Solution {public: int rectCover(int number) { int f1 = .原创 2020-06-09 23:39:38 · 151 阅读 · 0 评论 -
剑指Offer编程题--二进制中1的个数
题目链接:二进制中1的个数题意:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路: 设置一个数1,然后依次向左移,判断当前 数字与 n的值,如果不为0,那么就加1 class Solution {public: int NumberOf1(int n) { int ans = 0, k = 1; while(k){ if((n & k) != 0){ // n & k 不为..原创 2020-06-09 23:22:02 · 128 阅读 · 0 评论 -
剑指Offer编程题--数值的整数次方
题目链接:数值的整数次方题意:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0解题思路: 直接调用函数class Solution {public: double Power(double base, int exponent) { return pow(base, exponent); }};...原创 2020-06-09 22:44:05 · 115 阅读 · 0 评论 -
剑指Offer编程题--反转链表
题目链接:反转链表题意:输入一个链表,反转链表后,输出新链表的表头解题思路: 借助中间节点进行转换/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead)..原创 2020-06-09 22:24:16 · 208 阅读 · 0 评论 -
剑指Offer编程题--合并两个排序的链表
题目链接:合并两个排序的链表题意:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路: 利用递归的形式,先判断大小,然后递归/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: L.原创 2020-06-09 17:02:45 · 103 阅读 · 0 评论 -
剑指Offer编程题--栈的压入、弹出序列
题目链接:栈的压入、弹出序列题意:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路: 先分析一下为什么45321可以弹出。 先压入 1, 2, 3, 4,此时弹出4,栈里此时成为 1,2,3. 压入5 ,此时栈里成...原创 2020-06-09 16:38:47 · 172 阅读 · 0 评论 -
剑指Offer编程题---数组中出现次数超过一半的数字
题目链接:数组中出现次数超过一半的数字题意:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路: 用map存储,判断是否超过一半class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { m.原创 2020-06-08 08:17:00 · 135 阅读 · 0 评论 -
剑指Offer编程--数字在排序数组中出现的次数
题目链接:数字在排序数组中出现的次数题意:统计一个数字在排序数组中出现的次数。解题思路: .........很简单class Solution {public: int GetNumberOfK(vector<int> data ,int k) { int ans = 0; for(int i = 0; i < data.size(); i++){ if(data[i] == k){ ...原创 2020-06-07 22:56:28 · 88 阅读 · 0 评论 -
剑指Offer编程题--数组中只出现一次的数字
题目链接:数组中只出现一次的数字题意: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路: 数字计数,然后将只出现一次的拿出就可以class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { map<int,int> m; vector<int&...原创 2020-06-07 22:51:42 · 112 阅读 · 0 评论 -
剑指Offer编程题--不用加减乘除做加法
题目链接:不用加减乘除做加法题意:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路:1.不考虑进位对每一位相加。0加0、1加1结果都是0,0加1、1加0结果都是1。这和异或运算一样;2.考虑进位,0加0、0加1、1加0都不产生进位,只有1加1向前产生一个进位。可看成是先做位与运算,然后向左移动一位;3.相加过程重复前两步,直到不产生进位为止。class Solution {public: int Add(int num1, int原创 2020-06-07 16:52:01 · 111 阅读 · 0 评论 -
剑指Offer编程题--二叉树的深度
题目链接:二叉树的深度题意: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路: 利用递归,回溯判断最大值/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right...原创 2020-06-07 16:35:16 · 91 阅读 · 0 评论 -
剑指Offer编程题--二叉树的镜像
题目链接:二叉树的镜像题意:解题思路:利用递归方法依次进行替换,注意判断空 /*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: void Mi.原创 2020-06-07 15:46:36 · 98 阅读 · 0 评论 -
剑指Offer编程题--用两个栈实现队列
题目链接:用两个栈实现队列题意: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路: push:就正常向stack1进行push操作 pop:如果stack2为空,将stack1中的元素push进stack2 ,如果不为空,就直接进行 pop操作class Solution{public: void push(int node) { stack1.push(node); // 直接push }...原创 2020-06-07 14:51:41 · 105 阅读 · 0 评论 -
剑指Offer编程题--变态跳台阶
题目链接:变态跳台阶题意: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路: 找规律class Solution {public: int jumpFloorII(int number) { return pow(2, number-1); }};...原创 2020-06-07 14:20:31 · 111 阅读 · 0 评论 -
剑指Offer编程题--构建乘积数组
题目链接:构建乘积数组题意:给定一个数组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];)解题思路: 一个从前往后计算,一个从后往前计算就可以了class Solution {public...原创 2020-06-07 14:03:26 · 102 阅读 · 0 评论 -
剑指Offer编程题--和为S的两个数字
题目链接:和为S的两个数字题意: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路: 如果给的数组元素个数小于2,那么直接返回空数组 如果左边加右边小于sum,左加加 如果左边加右边大于sum,右加加class Solution {public: vector<int> FindNumbersWithSum(vector<in...原创 2020-06-07 12:15:29 · 114 阅读 · 0 评论 -
剑指Offer编程题--左旋转字符串
题目链接:左旋转字符串题意:对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。解题思路: 先截取前n个字符,然后截取剩下的字符,进行拼接 如果n的大小超过字符串长度,只需对字符串长度进行取余 如果为空,直接返回class Solution {public: string LeftRotateString(string str, int n) { ...原创 2020-06-07 10:28:36 · 122 阅读 · 0 评论 -
剑指Offer编程题--扑克牌顺子
题目链接:扑克牌顺子题意:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So L.原创 2020-06-06 23:13:49 · 161 阅读 · 1 评论 -
剑指Offer编程题--求1+2+3+...+n
题目链接:求1+2+3+...+n题意: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路: 高中等差数列公式, n * (n + 1) / 2class Solution {public: int Sum_Solution(int n) { return n * (n + 1)/ 2; }};...原创 2020-06-06 17:24:25 · 350 阅读 · 0 评论 -
剑指Offer_编程题.--数组中重复的数字
题目链接:数组中重复的数字题意: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路 利用map记录每个数字的个数就可以class Solution {public: // Parameters: // numbers: ...原创 2020-06-06 17:19:51 · 110 阅读 · 0 评论 -
剑指Offer编程题--表示数值的字符串
题目链接:表示数值的字符串题意:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是解题思路:对字符串中的每个字符进行判断分析 e(E)后面只能接数字,并且不能出现2次 对于+、-号,只能出现在第一个字符或者是e的后一位 对于小数点,不能出现2次,e后面不能出现小数点class Soluti原创 2020-06-06 15:00:03 · 118 阅读 · 0 评论 -
剑指Offer编程题--字符流中第一个不重复的字符
题目链接:字符流中第一个不重复的字符题意: 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果没有出现,返回 ‘#’解题思路: 插入时将字符的个数记下,然后遍历字符串一次就可以了class Solution{public: //Insert one char from stringstream vo...原创 2020-06-06 11:10:28 · 91 阅读 · 0 评论