
力扣/牛客
一些OJ题
零七七077
且慢
展开
-
二叉树的前序、中序、后序遍历(递归/非递归)
1.非递归的遍历其实就是使用栈来模拟递归的遍历。2.三个遍历中(非递归),前序和中序类似,只是访问根结点的时机不同:前序是入栈时访问根结点,而中序是出栈是访问根结点。3.后序遍历是不同的:它需要有个标记来记录之前访问过的右结点,让结点不再访问已经访问过的右结点,否则会死循环。1.前序遍历:1.递归:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;原创 2021-04-03 12:47:07 · 362 阅读 · 0 评论 -
22_数组中第K个最大元素
题目描述在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4题解:优先级队列(实质是堆)class Solution {public: int findKthLargest(vector<int>& nums, int k) { for(auto e:nums){ q.p原创 2021-03-19 23:00:56 · 88 阅读 · 0 评论 -
21_逆波兰表达式求值
题目描述根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 :输入: [“4”, “13”, “5”, “/”, “+”]输出: 6解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6题解:遍历后缀表达式:1.用一个辅助栈存放操作数。若当前元素为操作数,则入栈原创 2021-03-18 22:03:58 · 219 阅读 · 1 评论 -
20_栈的压入、弹出序列
题目描述:剑指 Offer 31. 栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。题解:用辅助栈st模拟进出每次往st中压入一个数据,然后与出栈序列比较:1.若st的栈顶元素不等于出栈序列,则继续压入数据;2.若st的栈顶元素等于出栈序列,原创 2021-03-18 18:03:05 · 90 阅读 · 0 评论 -
19_最小栈
题目描述设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。提示:pop、top 和 getMin 操作总是在 非空栈 上调用。题解:使用一个辅助栈注意辅助栈入栈时的条件。当有数据为 0、1、0 ,即最小元素有多个时,注意控制数据进入辅助栈的条件:if(_minst.empty() || val <原创 2021-03-18 17:09:27 · 100 阅读 · 0 评论 -
18_杨辉三角
题目描述给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。输入: 5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]题解class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> vv; //类对象数组 //开空间原创 2021-03-13 15:41:08 · 136 阅读 · 1 评论 -
17_只出现一次的数字 I/II/III
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 不能使用额外空间来实现。示例 2:输入: [4,1,2,1,2]输出: 4题解1.对于这道题,可使用异或运算⊕。异或运算有以下三个性质:(1)任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。(2)任何数和其自身做异或运算,结果是 0, a⊕a=0。(3)异或运算满足交换律和结合律,即a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)原创 2021-03-11 12:02:06 · 117 阅读 · 0 评论 -
16_字符串相加
题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。题解从后往前遍历两个字符串:1.定义val1和val2用于存放字符串每一位数字,定义next用于存放两数相加的进位。2.将两数相加,判断是否有进位。然后将相加后的数存放到新的字符串中,注意这里原创 2021-03-08 23:33:06 · 167 阅读 · 0 评论 -
15_验证回文串
题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。示例 1:输入: “A man, a plan, a canal: Panama”输出: true示例 2:输入: “race a car”输出: false题解1.先将字符串的大写字母全部转换为小写字母。2.定义两个指针begin和end,遍历字符串:(1)如果不是小写字母或数字,则后移/前移指针的位置,直至指针所指内容为字母或者数字;(2)如果是字母或者数字,则比较begin和end所指内原创 2021-03-08 21:27:54 · 217 阅读 · 0 评论 -
14_字符串最后一个单词的长度
题目描述计算字符串最后一个单词的长度,单词以空格隔开。示例输入:hello nowcoder输出:8题解从后往前找到第一个空格的位置,输出单词长度。#include<iostream>using namespace std;int main(){ string str; getline(cin,str); size_t pos=str.rfind(" "); cout<<str.size()-(pos+1)<<endl原创 2021-03-07 22:05:23 · 96 阅读 · 0 评论 -
13_字符串中的第一个唯一字符
题目描述给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = “leetcode”返回 0s = “loveleetcode”返回 2题解1.对字符串进行两次遍历。2.在第一次遍历时,使用哈希映射统计出字符串中每个字符出现的次数。3.在第二次遍历时,只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回 -1。class Solution {public: int firstUniqChar(string原创 2021-03-07 15:11:35 · 101 阅读 · 0 评论 -
12_仅仅反转字母
题目描述给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。示例 1:输入:“ab-cd”输出:“dc-ba”示例 2:输入:“a-bC-dEf-ghIj”输出:“j-Ih-gfE-dCba”题解1.定义两个指针begin和end分别指向字符串的头和尾。2.遍历字符串S,如果指针所指内容是字母,则交换begin和end所指内容。3.如果不是字母则将begin后移一个位置,直至begin所指为字母;对end同理。class So原创 2021-03-07 14:28:37 · 131 阅读 · 0 评论 -
11_旋转数组的最小数字
题目描述:剑指 Offer 11. 旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1题解1.直接遍历数组:int minArray(int* numbers, int numbersSize){ int min=numbers[0]; for原创 2021-03-05 23:16:22 · 112 阅读 · 0 评论 -
10_青蛙跳台阶问题
题目描述:剑指 Offer 10- II. 青蛙跳台阶问题一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。(0 <= n <= 100)示例 1:输入:n = 0输出:1示例 2:输入:n = 7输出:21题解1.假如只有1级台阶,只有一种跳法;假如有2级台阶,那就有2种跳法:一种是分两次跳,每次跳一下;另一种就是一次跳两原创 2021-03-04 22:36:05 · 458 阅读 · 4 评论 -
09_斐波那契数列
题目描述:剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。(0 <= n <= 100)答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返原创 2021-03-04 20:28:41 · 149 阅读 · 1 评论 -
08_从尾到头打印链表
题目描述:剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]题解1.反转链表,并计算链表长度。2.遍历数组,将链表结点的值存入数组中。typedef struct ListNode ListNode;int* reversePrint(struct ListNode* head, int* returnSize){ int len=0; ListN原创 2021-03-03 17:55:35 · 95 阅读 · 3 评论 -
07_替换空格
题目描述:剑指 Offer 05. 替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”题解1.遍历字符串 s,计算空格数量 n。2.开辟一个大小为 n*2+strlen(s)+1 的字符数组 ss 来存放新的字符串。3.再从左至右遍历字符串s:(1)如果当前字符 s[i] 是空格,则令 ss[j]=’%’、ss[j+1]=‘2’、ss[j+2]=‘0’,并将i的值加3。原创 2021-02-24 22:57:40 · 91 阅读 · 1 评论 -
06_数组中重复的数字
题目描述:剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。题解临时数组:1.题目中说明数组nums中的所有数字都在 0~n-1 之间,所以可以创建一个大小为 n 的数组arr,初始化值为0。2.遍历数组nums:nums[i] 的值是几,就将arr中对应的位置的值加1(对应位置的值即为nums原创 2021-02-24 21:35:15 · 86 阅读 · 0 评论 -
05_计算日期到天数的转换
题目描述根据输入的日期,计算是这一年的第几天。测试用例有多组,注意循环输入。输入描述:输入多行,每行空格分割,分别是年,月,日输出描述:成功:返回outDay输出计算后的第几天失败:返回-1题解1.判断输入日期是否合法,如果不合法直接返回-1。2.如果日期合法:先计算前(month-1)个月的天数,再加上第month个月的天数。3.计算过程中注意闰年的判断,如果输入日期大于2月且是闰年,则2月为29天。#include<iostream>using namespace原创 2021-02-24 10:54:35 · 305 阅读 · 0 评论 -
04_打印日期
题目描述给出年分m和一年中的第n天,算出第n天是几月几号。输入描述:输入包括两个整数y(1<=y<=3000),n(1<=n<=366)输出描述:可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来题解初始化日期为yyyy-01-00,然后将输入的日期加上n,判断是否向月、是否向年进位,最后输出日期。#include<iostream>using namespace std;class Date{priv原创 2021-02-22 23:03:46 · 136 阅读 · 0 评论 -
03_日期差值
题目描述有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。输入描述:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD输出描述:每组数据输出一行,即日期差值题解1.定义一个静态数组存放12个月每月对应的天数,其中2月默认为28天。若是闰年则2月为29天。2.直接相减借位不太好实现。可以每次让较小的日期++,然后判断是否等于较大的日期,其中++的次数即为相差的天数。3.注意题目描述(有点坑):如果两个日期是连续的我们规定他们之间的天数为原创 2021-02-22 21:43:25 · 160 阅读 · 1 评论 -
02_日期累加
题目描述设计一个程序能计算一个日期加上若干天后是什么日期。输入描述:输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。输出描述:输出m行,每行按yyyy-mm-dd的个数输出。题解1.定义一个静态数组存放12个月的日期,其中2月默认为28天。若是闰年则2月为29天。2.累加日期,若是大于当月所对应的天数,则向月进位;如果月增加到13,则另月为1,向年进位。3.注意题目要求的输入输出方式。#include<iostream>using names原创 2021-02-22 21:27:04 · 1068 阅读 · 3 评论 -
01_求1+2+3+...+n(要求不能使用乘除法等)
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。题解1使用静态成员:1.设置静态成员变量_i和_sum,在构造函数中进行累加运算。2.创建一个大小为n的对象数组,在创建的时候会自动调用n次构造函数,即实现了n次累加运算。3.注意在每次获取到_sum的值后,要将_i和_sum的值复原,不然会出错。class Sum{public: Sum(){ _sum+=_i;原创 2021-02-20 15:25:07 · 2273 阅读 · 4 评论