算法题
常考算法题
clarie huang
这个作者很懒,什么都没留下…
展开
-
C++交换a和b的方法
这个临时对象可以是一个栈上的对象,也可以是一个堆上的对象,具体取决于对象的类型和大小。它是一个二进制运算符,对于每一位,如果两个操作数的对应位不同,则结果为1,否则为0。具体来说,swap函数会先调用对象的移动构造函数,将a的值移动到一个临时对象中,然后再调用a的移动赋值运算符,将b的值赋给a。最后,再调用b的移动赋值运算符,将临时对象中的值赋给b。其中,使用临时变量的方法是最常见的,但使用异或运算的方法也很有趣。STL库中的swap函数是一个通用的交换函数,可以用于交换任意两个对象的值。原创 2023-10-08 21:04:10 · 2340 阅读 · 0 评论 -
用C++写一个生成n个m之内的随机整数的函数
函数用于获取当前时间的秒数,通常用于初始化随机数生成器的种子,以确保每次运行程序时生成的随机数序列都不同。头文件中定义了一些常用的 C++ 标准库函数,包括。都是 C++ 标准库中的函数。头文件中定义了一些与时间相关的函数,包括。头文件,以便编译器能够识别这些函数的声明。函数用于初始化随机数生成器的种子,而。函数之前,需要在程序中包含。函数用于生成随机数。原创 2023-09-21 17:46:20 · 356 阅读 · 0 评论 -
Leetcode:242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。//以下代码从个人leetcode复制而来//方法1:排序再比较两个字符串是否相等class Solution {public: bool isAnagram(string s, string t) { sort(s.begin(), s.end()); sort(t.begin(), t.e.原创 2021-11-19 11:48:04 · 224 阅读 · 0 评论 -
LeetCode7.整数反转
class Solution {public: int reverse(int x) { int rev = 0; while(x != 0){ if(rev < INT_MIN / 10 || rev > INT_MAX / 10){ return 0; } int digit = x % 10; x /= 10;原创 2021-11-10 16:55:21 · 60 阅读 · 0 评论 -
LeetCode24.两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。链接经典题型/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(.原创 2021-11-10 16:12:58 · 51 阅读 · 0 评论 -
LeetCode3. 无重复字符的最长子串
来啦,从开头选一题写吧,感觉得以专题为基础练习的……无重复字符的最长子串用unordered_map和滑动窗口解决此问题class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> freq; int left = 0, len = 0; int n = s.size(); for(int r原创 2021-11-10 15:04:44 · 3964 阅读 · 0 评论 -
LeetCode2. 两数相加(C++)
*** 之前想的每天刷刷题,写写博客,现在回头看看发现自己很久没有好好写算法题,也没有更新博客了。既然选择了做一个技术人员,一定的内容输出是有必要的。这会儿刚好比较清闲,兴致来了,打开leetcode和CSDN写点东西~~不知道从哪开始写,那就从开头写咯!***两数相加题目说明:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头原创 2021-11-09 11:13:29 · 586 阅读 · 0 评论 -
LeetCode:82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例1:最终结果返回最初的head节点示例2:最终结果返回n2节点思路:用三个节点判断是否有重复节点,重点是找到重复节点将其跳过并且明确最终应该返回哪个节点/** * Definition for singly-linked list. * struct ListNode { * int val; * .原创 2021-05-06 09:21:44 · 63 阅读 · 0 评论 -
LeetCode160:相交链表
方法一:分析题意,要判断两个链表是否相交,即判断它们的节点地址是否相同,利用set容器,先将链表A节点地址添加到set中,再遍历链表B并利用set的泛型算法判断B中是否有在A中出现过的节点,有则将其返回 (set底层是红黑树)时间复杂度:O(nlogn)空间复杂度:O(n)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNo原创 2021-04-25 11:32:05 · 69 阅读 · 0 评论 -
LeetCode:876. 链表的中间结点
方法一:首先想到的就是,先求出链表的长度length,再将head往后移动length/2次,上代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: int List_Length(L原创 2021-04-25 20:42:28 · 63 阅读 · 0 评论 -
单链表的逆置/反转(带头节点、不带头节点、递归)
单链表的逆置c/c++#include<stdio.h>#include<iostream>#include<stdlib.h>//定义结构体typedef int ElemType;typedef struct ListNode{ Elemtype data; ListNode *next;}ListNode,*LinkList;//方法1:带头节点,利用循环头插实现逆置ListNode* reverseList1(ListNode *head原创 2021-01-25 11:32:21 · 1001 阅读 · 1 评论 -
LeetCode:234. 回文链表
请判断一个链表是否为回文链表回文:即对称思路:本题的核心就是将后半段逆置,然后比较前后半段是否相等即可。首先找到中间节点,再逆置后半段,最后前后段逐个比较是否相等;其中第1、2步骤都在之前刷过的题中都有所涉及,本题最最重要的是找到问题的突破口。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), n原创 2021-05-06 07:34:24 · 88 阅读 · 0 评论 -
LeetCode之剑指offer22.链表中倒数第K个节点
从1开始记原创 2021-04-29 21:55:49 · 69 阅读 · 0 评论 -
LeetCode:21.合并两个有序链表
核心思想,构建一个头节点作为哨兵位(尾插法,一般考虑使用头节点)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, Lis原创 2021-04-26 19:16:08 · 83 阅读 · 0 评论 -
LeetCode:138.复制带随机指针的单链表
这道题还挺复杂的,主要是因为该单链表带随机指针解题思路分成三步:①拷贝原节点并将每一个节点链接到原来节点的后面 ②处理拷贝节点的random指针:拷贝节点的random指针指向被拷贝节点随机指针的下一个位置 ③拆解链表,把拷贝链表从原链表中拆解处来,再连接拷贝链表/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) {原创 2021-05-06 21:13:36 · 82 阅读 · 0 评论 -
贪心算法:LeetCode:455. 分发饼干 135. 分发糖果 435. 无重叠区间
分发饼干这题分配饼干的大小与小孩的饥饿程度有关,饥饿度更小的小孩更容易吃饱,所以考虑先满足饥饿度更小的小孩;首先对g和s排序,再从左往右遍历,当满足对应小孩时将饼干分配出去,不满足时找下一个饼干class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(),g.end()); sort(s..原创 2021-05-08 16:31:57 · 163 阅读 · 1 评论 -
LeetCode:26. 删除有序数组中的重复项 80. 删除有序数组中的重复项 II
删除有序数组中的重复项用两个“指针”index和i,index遍历数组,当nums[index]和nums[i]相等时,i直接往后找;直到它们相等时,将当前nums[i]的值赋给nums[++index]class Solution {public: int removeDuplicates(vector<int>& nums) { if(nums.empty()) { return 0; } .原创 2021-05-07 22:54:17 · 55 阅读 · 0 评论 -
LeetCode141、142:环形链表(C++)
这里非常巧妙地用到了两个指针,一个fast指针,每次跳两格,另一个slow指针,每次跳一格。将环形链表类比成环形操场跑步,不同速度的两个人一定会相遇。//141. 判断单链表是否有环/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */clas原创 2021-04-24 00:05:25 · 122 阅读 · 0 评论 -
给定一个数组,求其最长连号数的个数
例如:数组:{ 2,2,3,4,5,6,3,2 },最长连号{2,3,4,5,6},共有5个数int EvenNumber(int* arr, int len){ int tmp = 1;//保存连号数 int count = 1;//统计最长的连号数 for (int i = 0; i < len; i++) { if (arr[i + 1] == arr[i] + 1)//判断相邻两个数相等的条件 { tmp++; if (count < tmp)原创 2021-01-28 22:24:13 · 210 阅读 · 0 评论 -
LeetCode:136 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4//方法1:用两个下标逐一遍历数组,每当数组元素相同计数器加1,如果计数器等于1将结果返回,否则将计数器重新置为0int singleNumber(int* nums, int numsSize){ int count = 0;//计数器 for(int i = 0;i < nu原创 2021-02-03 23:42:13 · 61 阅读 · 0 评论 -
IP地址无效化
给你一个有效的 Ipv4 地址 ,返回这个 IP 地址的无效化版本。所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.” 。示例 1:输入:address = “1.1.1.1”输出:“1[.]1[.]1[.]1”示例 2:输入:address = “255.100.50.0”输出:“255[.]100[.]50[.]0”//方法1:char * defangIPaddr(char * address){ char *str = (char*)malloc((strle原创 2021-02-02 22:33:43 · 196 阅读 · 0 评论 -
逆序/顺序输出数字的每一位
给定一个整数,逆序输出数字的每一位,例如 123456 输出结果为 6 5 4 3 2 1逆序输出:输入:123456输出:6 5 4 3 2 1给定一个整数,输出数字的每一位,例如 123456 输出结果为 1 2 3 4 5 6.逆序输出:输入:123456输出:1 2 3 4 5 6//逆序输出void PrintReverse(int n){ while (n != 0) { printf("%d ",n % 10);//得到个位并输出 n /= 10;//丢弃个位原创 2021-01-28 21:40:44 · 439 阅读 · 0 评论 -
给定一个整数,统计十进制数字位数——推广→统计n进制数字的位数
统计一个整数是个几位数字?整数可以是负数,零或者正数.示例 1:输入:0输出:1示例 2:输入:123456789输出:9示例 3:输入:-123456789输出:9unsigned char GetFigures(int n){ int count = 0; if(n == 0) { return 1;//如果n为0,则直接将结果返回为1 } while(n != 0) { n /= 10;//除以10的次数就是该数的位数 count++; } retur原创 2021-01-28 20:38:18 · 449 阅读 · 0 评论 -
X的平方根:LeetCode第69题
实现 int sqrt(int x) 函数,计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。//方法1int mySqrt(int x){ int i; for(i = 0;i*i <= x;i++)//循环从0开始,直到i*i>x结束 {原创 2021-01-28 20:18:17 · 53 阅读 · 0 评论 -
数组的逆置
给定数组将其逆置,考虑从两头向中间同时逆置,将两头元素交换void reverse(int array[], int length){ int left = 0;//第一个元素下标 int right = length - 1;//最后一个元素下标 while (left < right) { //交换两头元素 int tmp = array[left]; array[left] = array[right]; array[right] = tmp; left++原创 2021-01-28 10:42:24 · 79 阅读 · 0 评论 -
将数字变成0的操作次数(C语言) LeetCode第1342题
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。示例 1:输入:num = 14输出:6解释:步骤 1) 14 是偶数,除以 2 得到 7 。步骤 2) 7 是奇数,减 1 得到 6 。步骤 3) 6 是偶数,除以 2 得到 3 。步骤 4) 3 是奇数,减 1 得到 2 。步骤 5) 2 是偶数,除以 2 得到 1 。步骤 6) 1 是奇数,减 1 得到 0 。示例 2:输入:num = 8输出:4解释原创 2021-01-27 22:37:26 · 257 阅读 · 0 评论 -
二进制中1的个数 LeetCode:剑指offer 15
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 7表示成二进制是 0111,有 3 位是 1。因此,如果输入 7,则该函数输出 3。示例 1:输入:7输出:3解释:7 的二进制为 0111,共有 3 位为 ‘1’。示例 2:输入:255输出:8解释:255 的二进制为 1111 1111,共有 8 位为 ‘1’。示例 3:输入:-1输出:32解释:-1 的二进制为 1111 1111 1111 1111 1111 1111 1111 1111,共有 32 位原创 2021-01-27 21:55:17 · 79 阅读 · 0 评论 -
LeetCode:剑指offer 03:数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3//方法1:类比冒泡法对比相等的元素int findRepeatNumber1(int* nums, int numsSize) //时间复杂度0(n^2),太慢了{ int i = 0; for (; i < numsSi原创 2021-01-26 21:00:47 · 110 阅读 · 0 评论 -
LeetCode LCP06题:拿硬币
桌上有 n 堆硬币,每堆的数量保存在数组 arr 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有硬币的最少次数。示例 1:输入:[4,2,1]输出:4解释:第一堆硬币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。示例 2:输入:[2,3,10]输出:8思路:根据整型/整型的特性,将每个元素加1除以2就是每堆最少拿的次数int minCount(int* coins, int coinsSize){ int coun原创 2021-01-26 20:10:30 · 332 阅读 · 0 评论 -
宝石与石头:LeetCode第771题
给定字符串 J 代表石头中宝石的类型,和字符串 S 代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S 中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = “aA”, S = “aAAbbbb”输出: 3示例 2:输入: J = “z”, S = “ZZ”输出: 0注意:S 和 J 最多含有 50 个字母。J 中的字符不重复。思路::字符串S中有多少个字符在原创 2021-01-25 16:46:41 · 77 阅读 · 0 评论 -
LeetCode,LCP 01:猜数字
小 A 和 小 B 在玩猜数字。小 B 每次从 1, 2, 3 中随机选择一个,小 A 每次也从 1, 2, 3中选择一个猜。他们一共进行三次这个游戏,请返回 小 A 猜对了几次?输入的 guess 数组为 小 A 每次的猜测,answer 数组为 小 B 每次的选择。guess 和 answer的长度都等于 3。示例 1:输入:guess = [1,2,3], answer = [1,2,3]输出:3解释:小 A 每次都猜对了。示例 2:输入:guess = [2,2,3], answe原创 2021-01-25 12:14:45 · 171 阅读 · 0 评论 -
数组异或操作:LeetCode第1486题
给你两个整数,n 和 start,其中 n 为数据的数量,start 为第一个数据。当前数据定义为:num = start + 2*i(i 表示第几个数据,从 0 开始)。请返回数列中所有数据按位异或(XOR)后得到的结果.示例 1:输入:n = 5, start = 0输出:8解释:数列为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。"^" 为按位异或运算符。示例 2:输入:n = 4, start = 3输出:8解释:数列为 [3, 5,原创 2021-01-23 21:42:05 · 105 阅读 · 0 评论 -
重新排列数组:LeetCode第1470题
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。示例 1:输入:nums = [2,5,1,3,4,7], n = 3输出:[2,3,5,4,1,7]解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]示例 2:输入:nums = [1,2,3,4,4,3,2,1], n原创 2021-01-23 21:23:16 · 88 阅读 · 0 评论 -
好数对的数目:LeetCode第1512题
给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。示例 1:输入:nums = [1,2,3,1,1,3]输出:4解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始示例 2:输入:nums = [1,1,1,1]输出:6解释:数组中的每组数字都是好数对示例 3:输入:nums = [1,2,3]输出:0方法原创 2021-01-22 16:08:47 · 74 阅读 · 0 评论 -
求一维数组的动态和:LeetCode第1480题
**题目:**给你一个数组 nums 。数组「前缀和」的计算公式为:rtSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的前缀和示例 1:输入:nums = [1,2,3,4]输出:[1,3,6,10]解释:前缀和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。示例 2:输入:nums = [1,1,1,1,1]输出:[1,2,3,4,5]解释:前缀和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。示例原创 2021-01-22 15:05:07 · 141 阅读 · 0 评论