剑指offer
刷题要多
GeniusPYH
学生
展开
-
剑指offer-圆圈中最后剩下的数(C++实现)
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2020-08-03 10:19:20 · 147 阅读 · 0 评论 -
剑指offer-翻转链表(输出新链表的表头)
class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(pHead==NULL) return NULL; ListNode* pre=NULL; ListNode* Next=NULL; while(pHead!=NULL) { Next=pHead->next;//:将Next职位p原创 2020-07-31 23:31:54 · 113 阅读 · 0 评论 -
剑指offer-左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它解题思路:既然是左旋转,我们可以把要旋转的字符放在一个字符串里,然后把其他的放在另一个字符串里,然后一拼接就可以了class Solution {public: string LeftRotateSt原创 2020-07-31 23:06:21 · 108 阅读 · 0 评论 -
剑指offer-和为S的连续正数序列(c++实现)
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!解题思路:滑动窗口思想。首先我们可以定义两个指针,例如int i=0;int j=1;然后我们判断这两个数的和跟S的大小关系,如果相等,那么这两个数就是和为原创 2020-07-30 13:20:09 · 148 阅读 · 0 评论 -
剑指offer-和为S的两个数字(C++实现)
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的解题思路:首先题目告诉了我们这是一个递增的数列,其次让我们求两个数的乘积最小的。我们知道和相同的两个数,他们相差越大,那么他们的积就越小。我们知道这是一个递增的数列,所以我们可以想到从两边开始找,我们可以定义两个指针分别指向数组的两边。如果他们的和大于S,则说明数大了则右边的指针–,如果和小于S,则说明数小了,则左边的指针++,直到左边和右边的指针重叠时,跳出循环class原创 2020-07-30 12:16:08 · 126 阅读 · 0 评论 -
剑指offer-数组中出现一次的数字
题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字解析思路:该题说一个数组中除了两个数字外,其他都出现了两次。那么我们想,如果只有一个数字出现了一次,其他都两次,我们会怎么做?很简单,将数组中每个元素都异或起来,那么只出现一次的那个数就出来了。那么这道题我们可以这么做吗?答案是肯定的,但是需要进行分组,就是把这个数组分成两个数组,每个数组中只有一个数出现了一次,其他都两次。那么我们如何进行分组呢?我们知道,将所有数都异或起来,最后得到的是只出现一次的那两个数原创 2020-07-26 21:08:06 · 97 阅读 · 0 评论 -
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
题目描述:可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:求出每一个数的1的个数,然后相加class Solution {public: int NumberOf1Between1AndN_Solution(int n) { int c=0; for(int i=1;i<=n;i++)//:这是1到n,区间可以任意改 { c+=is1(i); } return c;原创 2020-07-17 19:17:39 · 178 阅读 · 0 评论 -
输入一棵树,判断该二叉树是否为平衡二叉树(只考虑其平衡性)
平衡二叉树:它是一棵空树或者他的所有节点的左右子树高度差小于等于1。解题思路:如果是空树,那么他就是平衡二叉树。如果不是空树,则判断他的左子树是否为平衡二叉树,然后判断右子树是否为平衡二叉树,然后在判断自己是不是平衡二叉树。(主要就是判断高度差)class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot==nullptr)//:若为空则为平衡二叉树 {return tr原创 2020-07-17 18:57:17 · 217 阅读 · 0 评论 -
给定一个数组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]。不能使用除法
给定一个数组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中b[i]的值为数组A中除去A[i]其余元素的乘积class Solution {public: vector<int> multiply(const vector<int>& A) { vector<int> b;原创 2020-06-16 19:16:09 · 280 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:如果数字出现的次数超过了数组长度的一半,那么这个数字肯定是这组数的中位数,那么我们可以给这组数先排序,然后找到中位数。然后对数组进行遍历,如遇到等于中位数的,则计数器加1,最后再判断计数器的值是否大于数组的一半,如果大于,则返回这个中位数,如果不是则返回0class Solution {p原创 2020-06-09 19:05:23 · 101 阅读 · 0 评论 -
剑指offer-跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。class Solution {public: int jumpFloor(int number) { int count=0; if(number<=2)//:当台阶数小于等于2时,就有number种跳法 return number; int pre1=2;//:两阶时 int pre原创 2020-06-09 18:44:36 · 78 阅读 · 0 评论 -
剑指offer-不用+,-,*,/做加法
解题思路:位运算1.先对num1和num2做异或操作得到没有进位的值2.对num1和num2做与运算,并将结果左移移位,得到进位值。3.循环进行1,2步,直到进位为0,也就是num2=0;class Solution {public: int Add(int num1, int num2) { while(num2!=0)//:进位为0时 { int a=num1^num2;//:二者异或得到没有进位的值原创 2020-06-09 18:38:48 · 103 阅读 · 0 评论 -
圆括号匹配
#include<iostream>#include<string>#include<stack>using namespace std;bool chkParenthesis(string str, int n) { std::stack<char> a; for (int i = 0; i<n; i++) { if (str[i] == '(')//遍历字符串,当遇到(时将其压入站中 { a.push(str[i]);原创 2020-06-08 18:16:28 · 248 阅读 · 0 评论 -
剑指offer-求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
class Solution {public: int Sum_Solution(int n) { int sum=n; sum!=0&&(sum=n+Sum_Solution(n-1)); return sum; }};原创 2020-05-24 19:56:42 · 143 阅读 · 0 评论 -
变态跳台阶
class Solution {public: int jumpFloorII(int n) { if(n==1) return 1; if(n==2) return 2; if(n>2) return 2*jumpFloorII(n-1); }};原创 2020-05-24 19:54:58 · 65 阅读 · 0 评论 -
用两个栈实现队列
class Solution{public: void push(int node) { stack1.push(node); } int pop() { int r; if(stack2.size()>0) { r=stack2.top(); stack2.pop(); } else if(stack1.s原创 2020-05-24 19:53:40 · 94 阅读 · 0 评论 -
二维数组中的查找
class Solution {public: bool Find(int target, vector<vector<int> > array) { int size=array.size(); if(size!=0) { int row=size-1; int col=0; while(row>=0&&col<array[0].size()原创 2020-05-24 19:52:09 · 89 阅读 · 0 评论 -
从尾到头打印链表
这个问题可以利用栈的特性来做。先将链表的各数据压入栈里,然后出栈存在数组里。class Solution {public: vector<int> printListFromTailToHead(ListNode* head) { stack<int> arr; vector<int> arr2; ListNode *p=head; while(p!=NULL) {原创 2020-05-24 19:48:18 · 67 阅读 · 0 评论 -
替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。class Solution {public: void replaceSpace(char *str,int length) { int count=0; for(int i=0;i<length...原创 2020-04-02 20:12:04 · 68 阅读 · 0 评论