leecode练习-c语言实现
文章平均质量分 60
leecode练习-c语言实现的点点滴滴
阳光九叶草LXGZXJ
脚下踏着严霜时,就知道水要凝固成坚硬的寒冰了。
展开
-
leecode-C语言实现-28. 找出字符串中第一个匹配项的下标
介绍如何使用KMP算法解出此题,包含个人理解和图示。原创 2023-02-28 16:40:14 · 1026 阅读 · 1 评论 -
leecode-C语言实现-20. 有效的括号
leecode-C语言实现-20. 有效的括号,使用数据结构与算法基础中的线性表之顺序栈来进行解题。原创 2023-02-08 10:27:46 · 264 阅读 · 3 评论 -
leecode-C语言实现-25. K 个一组翻转链表
例如:链表为:1 -> 2 -> 3 -> 4 -> 5。步长为:3TmpPoint:来记录当前的链表位置。PreviousPoint:来记录上一个数组索引位为0的链表地址。NextPoint:记录当前数组索引位为2的元素链接的下一个链表地址。TmpArray:初始化一个长度为3的数组,里面存储链表中元素的指针。TmpPoint:&1PreviousPoint:NULLNextPoint:NULLTmpArray:{&1,null,null}TmpPoint:&2PreviousPoint原创 2022-07-14 11:37:37 · 354 阅读 · 1 评论 -
leecode-C语言实现-15. 三数之和------思路待改进版
例如数组为:数值:-5 -4 -3 -2 -1 0 1 2 3 4 5次数: 0 1 2 1 3 1 0 2 4 5 1索引: 0 1 2 3 4 5 6 7 0 9 10 min max temp数组长度:11(1)构造一个-10^5到10^5的数组,将数据一一放入。(2)放入时定义两个变量记录最大值和最小值下标。(原创 2022-07-05 17:32:45 · 410 阅读 · 1 评论 -
leecode-C语言实现-23. 合并K个升序链表
一、题目二、解题思路根据提示我们知道数值的最小值为-10000,最大值为10000,实际测试leecode需要的最小值为-5000,最大值为5000,那我们可以初始化一个数组长度10001,多的1是因为要算上0,数据组中的值都初始化为0,在定义一个变量来记录最小值-5000,形成一个key对value的形式,避免了插入排序。再将每个链表中的值以计数的方式记录到数组中,例如链表为:1》4》5例如数组起始为:{0,0,0,0,0,0,0,0,0,0}例如对应key 为 :{0,1,2,3,4,原创 2022-04-07 15:43:44 · 1463 阅读 · 0 评论 -
leecode-C语言实现-14. 最长公共前缀
一、题目二、解题思路(1)思路一数组中的所有字符串同时从第一个字符开始进行比较,如果都相等,复制到结果中,如果不相等,退出循环。第一个字符遍历完,需判断数组是否越界,表示某个字符串已经遍历完,结果中存的字符串就是最长前缀,退出循环。三、VS-2017-测试代码#include <stdio.h>#include <stdlib.h>#include <string.h>#define StrArrGroupNum 4#define StrArrNum原创 2022-04-06 14:14:55 · 1187 阅读 · 0 评论 -
leecode-C语言实现-13. 罗马数字转整数
一、题目二、解题思路我们遍历题目给出的字符串时,大部分情况下都是从大到小的顺序:M > D > C > L > X > V > I,但也会有一些特殊情况,所以我们须分两种情况进行讨论:(1)字符为C、X、I 时,在不超出字符串范围的情况下,需多判断一位字符,因为它们组成CD,CM,XL,XC, IV,IX这几个特殊的字符串,是表示较小的数在表示较大的数的左边。(2)M , D , L , V ,这几个数可以转换成相应的数字,不用做特殊处理。注意点:刚开始我原创 2022-04-03 18:06:43 · 1058 阅读 · 1 评论 -
leecode-C语言实现-21. 合并两个有序链表
一、题目二、解题思路(1)思路一我们可以先分情况讨论:1、链表一为空,直接返回链表二。2、链表二为空,直接返回链表一。3、链表一为空,链表二也为空,第一层逻辑里面已经做了判断,不予处理。4、链表一、链表二都不为空。就第四种情况展开讨论,我们可以先把要实现的功能进行拆分逐步实现,一个是创建一个头链表,另一个是往链表插入数据,这一块的实现可以参考我之前写的一遍博客《C语言学习-13-链表-练习01-删除、插入、释放动态链表》,然后就是同时遍历两个链表,我们再分情况来讨论:1、链表一的值等于原创 2022-03-28 15:31:40 · 1354 阅读 · 1 评论 -
leecode-C语言实现-12. 整数转罗马数字
一、题目二、解题思路例如:1994转换成罗马数字。我们可以把1994拆分成:1,9,9,4。拆分的方法就是1994余除10得到的余数就是拆分后的值。1994 % 10 = 199 。。。4199 % 10 = 19 。。。919 % 10 = 1 。。。91 % 10 = 0 。。。1再把这四个数字存储到一个数组中,这是由于strcat函数是在字符串后面进行追加,而不能在字符串前面追加,如我们第一个得到的是4的罗马数字IV,第二个得到是90的罗马数字XC,不用数组将顺序变成正序的话,就原创 2022-03-24 10:36:27 · 1973 阅读 · 1 评论 -
leecode-C语言实现-11. 盛最多水的容器
介绍leecode-C语言实现-盛最多水的容器问题的实现思路,内附实现C源码。原创 2022-03-15 09:49:40 · 1289 阅读 · 0 评论 -
leecode-C语言实现-8. 字符串转换整数 (atoi)
一、题目二、解题思路(1)思路一此题开始的时候一定要多读几遍题目,可以少绕一些弯路,我是通过解题错误来分析leecode是想要什么的样的结果的,总结为leecode想从一个空格+正负号+数字字符+字母字符中把数字字符转换成数字,我的思路是:1、例如字符串为:“w o r d s a n d 0 0 a 0 9 8 7”,遍历元素到第一个数字字符,得到第一个数组的下标,再进行前推前面这一段字符串(指的是0-w反推)是否合规,如果有点、a-z直接返回0并退出程序,如果没有w o r d原创 2022-03-10 17:46:47 · 1569 阅读 · 0 评论 -
leecode-C语言实现-7. 整数反转
一、题目二、解题思路(1)思路一例如给的数值为123,循环除以10,余数为拆分出的个、十、百、千位等,当商为0时,为结束标志。可以把每位的数值存储到链表中,123我们先把先算出的3放在链表头部,后面的2和1再往链表后面陆续追加,追加时我可以用一个临时变量来记录123一共有多少位,所有数值追加之后,计数为2,我们再从头部遍历数值:第一个数为3,计算值3*(10^2)=300,计数减一。第二个数为2,计算值2*(10^1)=20,结果值等于300+20=320,计数减一。第三个数为1,计算值1*原创 2022-03-08 14:01:25 · 921 阅读 · 0 评论 -
leecode-C语言实现-6. Z 字形变换
一、题目二、解题思路列举出几种情况,来分析其中的规律,思考整体的代码逻辑和算法复杂度,再来编写代码,我的个人习惯。举例字符串:PAYPALISHIRING(1)行数:3P这一行:P>A>Y>P>A,跳到第四个字符到A,再跳四个到H,再到N。A这一行:A>Y>P,跳到第二个字符到P,P>A>L,再跳两个到L,再到S,I,I,G。Y这一行:Y>P>A>L>I,跳到第四个字符到I,再跳四个到R。跳4跳2 跳2跳4(原创 2022-03-07 14:54:16 · 698 阅读 · 0 评论 -
leecode-C语言实现-5. 最长回文子串
一、题目二、解题思路(1)思路一举例:字符串为babad1、取第一个元素b和最后一个元素d到第二元素a进行比较,b和d不等下一个,b和a不等下一个,b和b相等,第一个元素b向后移动一位,第三个元素b向前移动一位,看是否相等,直到把两者之间的元素都比对完,确认bab是回文数。2、取第二个元素a和最后一个元素d到第三元素b进行比较,a和d不等下一个,a和b相等,第二个元素a向后移动一位,第四个元素a向前移动一位,看是否相等,直到把两者之间的元素都比对完,确认aba是回文数,之后的元素同上。(2)思原创 2022-03-04 14:25:57 · 952 阅读 · 0 评论 -
leecode-C语言实现-4. 寻找两个正序数组的中位数
一、题目二、解题思路(1)思路一由于两个数组是有序的,所以可以用插入排序或qsort方法进行数组排序合并,排完序之后,如果元素总个数n为奇数,中位数为第(n-1)/2+1个元素(不是索引位)。如果元素总个数n为偶数,中位数为第n/2+1个和第n/2个的和除以二,再根据中位数的位置在排好序的数组中遍历找出。此思路没有用代码进行实现,由于此思路的算法复杂度为O(n^2),并且需要重新定义一个长度为m+n的数组,占用的内存会比较多。(2)思路二先找出中位数的位置,如果元素总个数n为奇数,中位数为第原创 2022-03-02 15:36:53 · 638 阅读 · 1 评论 -
leecode-C语言实现-3. 无重复字符的最长子串
一、题目二、解题思路(1)思路一定义一个长度为给定字符串长度一样的数组,全部初始化为’\0’,这是由于leecode给定的测试用例中包含26个大小写字母,数字,各种符号及空格。在定义一个临时变量x来存放字符串长度,进行举例:例如:字符串为:a,b,c,a,b,c,b,b1、遍历字符串取出元素a,由于数组中时空的,将a放入其中。将元素存入到数组中,计数器x加一。2、遍历字符串取出元素b,让b与数组中的每个元素进行比较,发现a不等于b,将b存入到数组中,计数器x加一。3、遍历字符串取出元素c,原创 2022-02-25 16:30:21 · 752 阅读 · 1 评论 -
leecode-C语言实现-9. 回文数
一、题目二、解题思路例如判断123321是不是回文数,让123321每次余除以10,余数为各位上的值,放到一个数组中,再存数值的过程中,我们可以取得这个数字一共有多少位,作为我们的遍历次数进行铺垫,我定两个指针变量分别从头和尾进行遍历,遍历次数需分情况进行判断:(1)如果位数长度len为奇数,遍历次数为(len-1)/2,举例12321,头尾遍历1=1,2=2,遍历两次即可,遍历次数:(5-1 )/2(2)如果位数长度len为偶数,遍历次数为len / 2,举例123321,头尾遍历1=1,2=原创 2022-02-24 16:35:03 · 664 阅读 · 0 评论 -
leecode-C语言实现-1619. 删除某些元素后的数组均值
一、题目二、解题思路(1)方法一之计数法通过题目要求0 <= arr[i] <= 10的5次方,元素最大值为100000,最小值为0,我们可以初始化一个长度为100000的数组b,记录题目中给的数组a中各元素出现的值。在遍历数组b中的元素,剔除前百分之五x和后百分之五y,例如判断前百分之五时,需要考虑x小于、等于、大于第一个下标不为0的情况,我这里不建议大家使用这种方法,第一:效率一般。第二:判断逻辑有些复杂,代码不清晰,比较绕。举例:数组a:数据:1,2,2,2,2,2,2原创 2022-02-24 11:32:20 · 694 阅读 · 0 评论 -
leecode-C语言实现-2. 两数相加
一、题目二、解题思路(1)方法一两个不同长度的链表其中的元素相加,题目中描述val最大为9,最小为0,也就是说两数之和的最大值是18,最小值是0。可以通过两数相除得到十分位的值,余除得到个位的值,再用一个临时变量来记录上一个十分位的值,当需要进位时用到。当一个链表较短提前遍历完时,我们可以对其中没有遍历完的链表继续遍历,来得到全部结果。三、虚机测试代码#include <stdio.h>#include <stdlib.h>struct ListNode {原创 2022-02-22 15:19:00 · 270 阅读 · 0 评论 -
leecode-C语言实现-1. 两数之和
一、题目二、解题思路(1)方法一双重循环,第一层循环从第一个值开始遍历,和第二层循环的第二个值开始进行遍历相加是否为目标值,如果是,记录两个值的索引号,如果没有返回空值。三、虚机测试代码#include <stdio.h>#include <stdlib.h>void main(){ int* twoSum(int* nums, int numsSize, int target, int* returnSize); void PrintfArra原创 2022-02-22 11:12:13 · 694 阅读 · 0 评论 -
leecode-C语言实现-231. 2 的幂
一、题目二、解题思路(1)思路一循环法:2的幂是偶数,除以2余数为0,一直循环的除以2,商为1时,表示次数为2的次幂。(2)思路二以下是2的幂次,十进制和二进制的对照表。十进制二进制2104100810001610000以下是2的幂次减一,十进制和二进制的对照表。十进制二进制1013011701111501111将2的幂次与2的幂次减一进行按位取与,如果此数是2的次幂的话,结果为0,由此原创 2022-02-22 09:47:32 · 411 阅读 · 0 评论 -
leecode-C语言实现-88. 合并两个有序数组
一、题目二、解题思路1、两个有序数组进行合并,可以想象成插入排序,将有序数组b中的元素逐一遍历插入到有序数组a中,当b中某个元素小于等于其中的某个元素时,将此元素包含此元素右边的有效元素(非零的值)进行右移一位,移动完成后,再进行更新当前匹配的值,最后在跳出内层循环,因为后续元素不需要再进行遍历。如果没有匹配到元素,只需在数组a的尾部加上此元素即可,之后便可以继续比对有序数组b中的下一个元素。三、虚机测试代码#include <stdio.h>#include <stdlib.原创 2022-02-21 09:25:18 · 1056 阅读 · 0 评论 -
leecode-C语言实现-136. 只出现一次的数字
一、题目二、解题思路1、思路一计数法:通过题目我们知道除了某个元素其他的元素都有重复值,也就是说元素总数为奇数n,去除重复值的话,元素总数x为(n-1)/2+1,我们可以初始化两个长度为x的数组,一个数组记录唯一值,另一个记录每个唯一值对应的出现次数,出现次数为1,就是我们最后要找的值。2、思路二异或法:c语言中,两个相同值进行异或运算返回0,两个不同的值进行异或运算返回两数之和,当两个相同进行异或之后,再和一个不同值进行异或运算,返回不同值。情况举例如下:(1)a ^ a 返回0(2)a原创 2022-02-18 14:03:17 · 507 阅读 · 0 评论 -
leecode-C语言实现-268. 丢失的数字
一、题目给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。二、解题思路(1)代码1思路双重循环,外层为循环次数,里层为需要遍历的数组,用一个中间变量值进行比较,注意中间变量要初始化为数组的第一个元素。外层循环一次,中间变量需要减一。遍历数组时,数组中的元素和中间变量一致,表示数组中存在中间变量,这时跳出循环,后面的元素没有必要再进行遍历。(2)代码2思路临时数组:表示里面的数据有序且间隔为1,当测试数组长度为4时,临时数组为{0原创 2022-02-17 14:54:02 · 1102 阅读 · 0 评论 -
leecode-C语言实现-169. 多数元素
一、leecode题目二、解题思路以下方法的前提条件是:出现次数最多的元素的个数一定要大于全部元素个数的二分之一。(1)方法1定义两个变量,一个变量a记录最多的值,另一个变量b记录最多值出现的次数,分三种情况:1、当a等于数组中的元素时,b加一。2、当a不等于数组中的元素且b不等于0时,表示a还是记录最多的元素,b减一。3、当a不等于数组中的元素且b等于0时,表示a不是记录最多的元素,b减一,a改为当前数组中的元素。(2)方法2定义一个数组来表示堆栈,先进的后出,后进的先出,分为三种情况原创 2022-02-16 16:13:56 · 335 阅读 · 0 评论 -
leecode-C语言实现-242. 有效的字母异位词
一、leecode题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false提示:1 <= s.length, t.length <= 5 * 104s 和 t 仅包含小写字母来源:力扣(LeetCo原创 2022-02-16 14:20:29 · 636 阅读 · 0 评论 -
leecode-C语言实现-1979. 找出数组的最大公约数
一、leecode题目给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。两个数的 最大公约数 是能够被两个数整除的最大正整数。示例 1:输入:nums = [2,5,6,9,10]输出:2解释:nums 中最小的数是 2nums 中最大的数是 102 和 10 的最大公约数是 2示例 2:输入:nums = [7,5,6,8,3]输出:1解释:nums 中最小的数是 3nums 中最大的数是 83 和 8 的最大公约数是 1示例 3:输入:nums原创 2022-02-14 17:09:12 · 1167 阅读 · 0 评论 -
leecode-C语言实现-83. 删除排序链表中的重复元素
一、题目存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素只出现一次 。返回同样按升序排列的结果链表。示例(1)输入:head = [1,1,2]输出:[1,2]示例(2)输入:head = [1,1,2,3,3]输出:[1,2,3]二、解题思路(1)定义两个指针变量,一个指向第一个元素的地址,第二个指向第二个元素的地址。(2)定义一个变量从第二元素开始遍历,遇到...原创 2022-01-13 14:29:04 · 687 阅读 · 0 评论 -
leecode-C语言实现-704. 二分查找
leecode-704. 二分查找原创 2021-12-29 15:03:00 · 472 阅读 · 0 评论