- 博客(130)
- 收藏
- 关注
原创 分解质因数
题目:输入一个正整数,求其分解之后的质因数,如有重复的质因数,则只输出一个。解析:暴力求解例如输入:12输出:2, 3 (全部的质因数为2 2 3,由于2重复了,所以输出一个2)参考答案:#include <iostream>#include <cstdio>using namespace std;int main(){ int n; scanf("%d", &n); int k = 2; int res = 0; while(n
2020-08-30 09:41:00 681
原创 判断字符串括号是否匹配
题目:给定一个只包括 ‘(’,’(’,’[’,’]’,’{’,’}’ 的字符串,判断字符串是否匹配解析:利用栈的思想解题。参考答案:#include <iostream>#include <cstring>#include <stack>#include <algorithm>using namespace std;stack<char> s;int Check(char* p){ int len = strlen(p
2020-08-23 16:18:12 522
原创 完全二叉树的最后一个节点
题目:给定一棵完全二叉搜索树,返回最后一个最右边的节点。如下图,则返回8。 5 / \ 3 7 / \ / \2 4 6 8解析:方法一: 递归,求子树的高度:如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树继续递归。如果当前节点为叶子节点,则返回;由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层,每次都求树的高度。时间复杂度为O(lgN * lgN)。参考答案:/**** typedef struct
2020-08-04 23:03:21 2175 1
原创 c++多线程交替打印AB
#include <thread>#include <iostream>#include <mutex>#include <condition_variable>using namespace std;mutex data_mutex;condition_variable data_var;bool flag = true; void printA(){ while(1) { this_thread::
2020-08-04 21:26:03 755
原创 判断链表是否有环
题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。解析:双指针解法(快慢指针)。参考答案:/*struct ListNode { int val; struct ListNode *next;};*/class S
2020-08-04 16:06:40 118
原创 字符串分割
题目:给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。例如:给定s=“leetcode”;dict=[“leet”, “code”].返回true,因为"leetcode"可以被分割成"leet code".解析:动态规划问题。参考答案:class Solution{public: bool wordBreak(string s, unordered_set<string>
2020-07-31 15:48:21 585
原创 二叉搜索树的第k个结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 5 / \ 3 7 / \ / \2 4 6 8解析:方法一: 中序遍历二叉搜索树(递归方式),得到从小到大的排好序的数,然后找出第k个结点。方法二: 利用栈求解,直接看代码。参考答案:/**** typedef struct node{* int val;* struct node *lef
2020-07-29 23:50:29 207
原创 按之字形顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 3 / \ 9 20 / / \16 15 7解析:利用队列的先入先出思想来求解,先把根节点放入队列中的队首,如果有子结点,则把子结点依次(先左儿子后右儿子)放入队尾,然后弹出队首元素。接下来重复前面的操作,把奇数层的从左往右存入数组,偶数层从右往左存入数组,直到队列元素全部弹出。<知识点:层序遍历的改进&
2020-07-29 22:46:04 127
原创 环形链表入环的第一个节点(力扣:环形链表 II)
题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。解析:双指针解法(快慢指针)。快慢指针(慢指针一次走一个步长,快指针一次走两个步长)第一次相遇的地
2020-07-28 09:16:59 410
原创 c/c++实现一个strcpy
char *Mystrcpy(char* res, const char* str){ assert(res != NULL && str != NULL); //断言,如果返回值为假,则程序终止。 if(res== NULL || str == NULL){ return NULL; } if(res == str){ return res; } int i = 0; while(str[i] != '\0'){ res[i] = str[i.
2020-07-28 08:38:16 106
原创 回文数索引
题目:给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。输入描述:第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。输出描述:如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如:bcc我们可以删掉位置0的b字符。示例输入:3aaabbaaaaa输出:30-1解析:双指针解法。参考答案:#i
2020-07-27 22:16:36 133
原创 删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。输入: 1 2 3 3 4 4 5输出: 1 2 5解析:双指针解法。参考答案:/*struct ListNode { int val; struct ListNode *next;};*/class Solution {public:
2020-07-23 16:07:29 91
原创 礼物的最大价值(一维动态规划&二维动态规划)
题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物解析:方法一: 动态规划(二维)。动归解题的三大步骤,第一步,列出确定状态dp[i][j]表示到达i
2020-06-24 12:13:05 219
原创 最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。解析:方法一: 双指针的滑动窗口解法。方法二: 对方法一进行优化。参考答案:class Solution{public: int lengthOfLongestSubstring(string s)
2020-06-22 12:00:18 197
原创 队列的最大值
题目:请定义一个队列并实现函数max_value得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和max_value需要返回-1输入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,2]输入: ["M
2020-06-20 22:18:21 536
原创 股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。(注意:利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。)输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。解析:如果使用暴力求解即两层for循环找到最大值和
2020-06-18 11:39:50 341
原创 构建乘除数组
题目:给定一个数组 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]。不能使用除法。输入: [1, 2, 3, 4, 5]输出: [120, 60, 40, 30, 24]解析:本题目的是求数组中除了当前元素的所有元素的乘积。解题思路:对称遍历。参考答案:class Solution{public: vector<int> constructArr(vecto
2020-06-18 10:30:20 139
原创 二叉树(或二叉搜索树)的最近公共祖先
题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。例如,给定如下二叉搜索树: root = [6, 2, 8, 0, 4, 7, 9, null, null, 3, 5]输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出: 5解释: 节点
2020-06-17 10:49:19 292
原创 二叉树搜索树的最近公共祖先
题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。例如,给定如下二叉搜索树: root = [6, 2, 8, 0, 4, 7, 9, null, null, 3, 5]输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4输出: 2解释: 节点 2
2020-06-17 10:03:01 171
原创 把字符串转换成整数
题目:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。要求: 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符
2020-06-16 12:08:29 513
原创 不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。输入: a = 1, b = 1输出: 2解析:如果碰见类似的题目,首先就要想到位于运算求解。先求两个数的不进位加法(异或),再求两个数进位值(与运算并左移一位)。直接看代码,简单易懂。参考答案:class Solution{public: int add(int a, int b){ int sum = 0, carry = 0; while(b != 0){ //su
2020-06-14 10:40:08 92
原创 求1+2+...+n
题目:求1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。输入: n = 3输出: 6输入: n = 9输出: 45解析:使用递归算法和位运算来结束递归终止条件。参考答案:class Solution{public: int sumNums(int n){ n && (n += sumNums(n - 1)); return n; }};...
2020-06-14 10:29:40 173
原创 和为K的子数组
题目:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。输入: nums = [1, 1, 1], k = 2;输出: 2 解释: [1, 1] 与 [1, 1] 为两种不同的情况。解析**方法一:**暴力枚举法。**方法二:**前缀和(用到哈希表)。参考答案:class Solution{public: int subarraySum(vector<int>& nums, int k){ //方法一:暴力枚举法 int c
2020-06-13 11:44:57 333
原创 字符串压缩
题目:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母。输入: "aabcccccaaa"输出: "a2b1c5a3"输入: "abbccd"输出: "abbccd"解释: "abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。参考答案:class Solution{public: string co
2020-06-12 16:32:15 122
原创 圆圈中最后剩下的数字
题目:0, 1, ... , n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。输入: n = 5, m = 3输出: 3输入: n = 10, m = 17输出: 2解析:主要考察数学思维能力。解法一: 递归算法。解法一: 迭代算法。参考答案:class Solution{p
2020-06-12 11:01:39 101
原创 扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。输入: [1, 2, 3, 4, 5]输出: true输入: [0, 0, 1, 2, 5]输出: true解析:先对数组排序,统计出0的个数,然后从0后面的数遍历数组,如果相邻两个数相同的(扑克中成为对子),则直接返回false。如果相邻元素不相等,则相减之后和0的个数比较,若大于0的个数返回fals
2020-06-11 10:54:14 437
原创 n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.0
2020-06-07 12:09:40 137
原创 左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。输入: s = "abcdefg", k = 2输出: "cdefgab"解析:方法一:利用数学取余的思维求解,直接看代码,简单易懂。方法二:使用工具直接截取(有点投机取巧,不适合面试回答)。参考答案:class Solution{ string reverseLeftWords(s
2020-06-06 10:29:23 214
原创 旋转单词顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。输入:"the sky is blue"输出:"blue is sk
2020-06-05 09:52:36 221
原创 和为s的连续正数序列
题目二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15,所以结果打印出3个连续序列{1, 2, 3, 4, 5}, {4, 5, 6}, {7, 8}。输入:target = 15输出:[[1, 2, 3, 4, 5 ], [4, 5, 6], [7, 8]]解析:利用滑动窗口方法求解。定义两个指针i和j,指向第一个元素1,这两个指针指向的元素之和sum,如果sum小于目标值target,则j向右移动,
2020-06-04 11:06:15 136
原创 和为s的两个数字
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。输入:nums = {2, 7, 11, 15},target = 9输出:[2, 7] 或者 [7, 2]解析:双指针法。一个指针L第一个元素,另一个指针R指向最后一个元素。如果两个指针指向的元素之和大于s,则把R指针向左移动,如果小于s,则把L指针向右移动,如果等于s,则输出L和R指向的元素。参考答案:class Solution{ vector<in
2020-06-03 21:45:51 134
原创 数组中数字出现的次数
题目:一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解析:利用位运算的异或关系求解,把两个只出现一次的数分别放入两个数组中(有出现两次的必须放在一个数组),再对这两个数组分别使用异或,即可求出这个两个只出现一次的数。参考答案:class Solution{public: vector<int> singleNumbers(vector<int> nums){ int s = 0
2020-06-02 09:28:16 472
原创 平衡二叉树的判断
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解析:递归,深度遍历(dfs),比较左右子树高度差是否不大于1(即小于等于1)。参考答案:/**** struct TreeNode{* int val;* TreeNode *left;* TreeNode *right;* }*/class Solution{public: bool isBalanced(TreeNode *root){
2020-06-01 09:08:38 252
原创 二叉树的深度(DFS)
题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解析:递归,深度遍历(dfs)。参考答案:/**** struct TreeNode{* int val;* TreeNode *left;* TreeNode *right;* };*/class Solution{public: int maxDepth(TreeNode *root){ if(root == NULL) ret
2020-05-31 23:50:46 392
原创 数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。解析:两种解法:方法一:哈希表。方法二:二分查找。参考答案:class Solution{ //方法一:哈希表 int search(vector<int> &nums, int target){ if(nums.empty()) return 0; unordered_map<int, int
2020-05-29 22:14:13 119
原创 两个链表的第一个公共节点
题目:输入两个链表,找出它们的第一个公共节点。如上图A链表和B链表的公共节点为8。解析:分别采用两种方法:方法一:即剑指解法,计算出两个链表的长度,然后让较长的链表先走长出来的部分,然后两个链表同时走,两个链表第一次相遇的节点即为所求。方法二:双指针法,定义两个指针,node1和node2,分别指向链表headA和链表headB的头结点,然后分别开始逐个遍历,如果node1先走到headA的尾结点,则重新定位到headB的头结点。如果node2先走到headB的尾结点,则重新定位到headA的
2020-05-28 22:55:01 137
原创 数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解析:使用归并排序来求解,只需加一个统计出现逆序对次数的条件。参考答案:class Solution{public: int count = 0; void mergeSort(vector<int>& nums, vector<int>& temp, int L, int R){ if(L >= R) ret
2020-05-27 12:33:46 174
原创 第一个出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。解析:利用hash表的原理。开一个数组,设下标为字符,数组为相应字符出现的次数,最后遍历数组中为1的下标即可。参考答案:class Solution{public: char firstUniqChar(string s){ if(s.empty()) return ' '; vector<int> arr(128, 0); for(int i = 0; i < s.si
2020-05-26 12:10:06 134
原创 丑数
题目:我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。例如6、8都是丑数,但14不是,因为他包含因子7。习惯上我们把1当做第一个丑数。解析:普通方法例如依次判断每一个数是否为丑数,在进行统计,这样时间复杂度很高。因为每一个丑数都是要乘2,3或5。这时候为了避免重复判断丑数,则可以利用动态规划解决此问题,这样就能把时间复杂度降低到O(n)。参考答案:class Solution{public: int nthUglyNumber(in
2020-05-24 22:39:16 109
原创 把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数组拼接起来排成一个数,打印能拼接出的数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。解析:首先把数组转换成字符串数组,进行字符串自定义排序,使用lambda表达式进行自定义排序,auto Lambda = [](类型 变量, 类型 变量) {return 排序条件;};,就能自动推导出排序规则。参考答案:class Solution{public: string minNumber(vector&l
2020-05-23 22:48:17 112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人