数据结构
super尚
热爱学习的一枚研究僧
展开
-
统计数组中的字符C语言解法——剑指 Offer 50. 第一个只出现一次的字符
题目在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例 1:输入:s = “abaccdeff”输出:‘b’示例 2:输入:s = “”输出:’ ’限制:0 <= s 的长度 <= 50000解题思路字典查找法先用一个26个的数组,保存每个字符对应的数量,然后再去查哪个位置的字符数量是1就行了。变形一下就是加上大写,那也是一样的操作,只不过初始化的数组要大一些;还有就是要找任意一个字符只出现一次,那就更加简单了,只用在第二原创 2021-12-13 16:38:38 · 722 阅读 · 0 评论 -
迭代之“反转链表”——剑指 Offer 24. 反转链表
题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000解题思路从题目来看,就是将链表的指向反过来。迭代:利用三个额外空间节点,每次调整当前节点的指向。调整流程如下:1、用一个节点保存当前节点下一个节点的位置;2、将当前节点指向前一个结点;3、额外空间的前一原创 2021-12-06 10:11:55 · 714 阅读 · 0 评论 -
“双指针的巧妙”——剑指 Offer II 006. 排序数组中两个数字之和
解题思路如果没有排序,就只能一个个遍历,但在已经排序的情况下,可以通过首尾指针快速进行查找。并且一定存在,且只存在一个,这样就不用考虑边界情况,以及多个的情况。如果时有可能不存在的话,那么就不能用下面的while写法,应该改成i!=j,这样只要两者不相交就说明没有完全检测一遍。如果存在多个的话,就不懂了。。。。有想法的同学可以评论区交流一下~~代码class Solution { public int[] twoSum(int[] numbers, int target) {原创 2021-11-28 22:15:00 · 174 阅读 · 0 评论 -
力扣专题——剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
题目给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。解题思路主要用到了数学的方法,奇数和偶数的二进制中1的个数是有规律的。通过观察可以发现偶数A中1的个数与其除以2得到的数B的个数相同,这是因为这个偶数A相当于B左移一位得到的数,故相同。而比A大一个的数则比A多一个1,这是因为A是偶数,那么其二进制数最后一位为0,那么下一个数就是在这里加一。代码class Solution: def countBits(self, n: int) -&原创 2021-10-24 22:00:48 · 169 阅读 · 0 评论 -
输入n个整数,使用冒泡排序算法按从小到大排序,然后输出结果。
输入:第一行是1个整数n(n<100),表示随后有n个整数,第二行有n个整数,空格隔开。输出:输出一共为n-1行,每行为每趟排序的结果。代码:chang=int(input(""))num=input("")arr = [int(n) for n in num.split()]for i in range(chang-1): for j in range(1,chang): if arr[j-1]>arr[j]: arr[j -原创 2021-10-09 21:38:10 · 13416 阅读 · 0 评论 -
力扣专题——650. 只有两个键的键盘
寻找最小公因数最初记事本上只有一个字符 ‘A’ 。你每次可以对这个记事本进行两种操作:Copy All(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。Paste(粘贴):粘贴 上一次 复制的字符。给你一个数字 n ,你需要使用最少的操作次数,在记事本上输出 恰好 n 个 ‘A’ 。返回能够打印出 n 个 ‘A’ 的最少操作次数。示例 1:输入:3输出:3解释:最初, 只有一个字符 ‘A’。第 1 步, 使用 Copy All 操作。第 2 步, 使用 Paste 操作原创 2021-09-19 10:06:54 · 221 阅读 · 0 评论 -
面试题——递增间隔分割列表
题目:编写函数get_list,入参为一个列表L,将列表按照1、2、3、4…等递增间隔来进行分割,返回分割后的二维数组思路:由于添加的列表是一个不规则的,所以不能简单使用reshape来直接修改形状,这里使用append来添加到新的列表。具体操作就是:创建一个新的列表,每次append一个递增序列的小列表。具体处理方法就是使用一个idx来每次定位下一个要append的位置,使用varlen来进行append大小的调整。代码:# 给定列表listA = ['Sun', 'Mon原创 2021-09-06 16:31:28 · 637 阅读 · 4 评论 -
力扣专题——剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路双指针,定义两个指针,一快一慢,想让快指针走k个位置,再让快慢指针同时前进,当原创 2021-09-02 16:20:20 · 169 阅读 · 0 评论 -
力扣专题——“11. 盛最多水的容器”
题目:盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。解题原创 2021-08-21 22:10:18 · 135 阅读 · 0 评论 -
力扣专题——“16. 最接近的三数之和”
题目:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。解题思路此题与15. 三数之和类似,解题方法也类似。都采用了一个循环里边加双指针的思想,不同之处在于,这里的三个数可能不是目标数字的和,而是最接近原创 2021-08-21 22:04:28 · 177 阅读 · 0 评论 -
python:迭代和递归(回溯)
#回溯A=['a','b','c']res=[]def sons(n,t): res.append(t) for i in range(n,len(A)): sons(i+1,t+[A[i]])sons(0,[])print(res)#迭代nums=['a','b','c']res = [[]]for i in nums: res = res + [[i] + num for num in res]print(res)迭代和递归(回溯)的原创 2021-04-01 15:57:50 · 435 阅读 · 0 评论 -
动态规划问题的一点自我理解
动态规划简单说,就是大事化小,小事化了。稍微详细了说,就是在面对一个含有重叠子问题和最优子结构问题的时候,需要解子问题,再结合子问题的解来得出原问题的解。大多数情况下,子问题都比较类似,这样动态规划就试图将每个子问题仅解决一次,并将其记忆化存储。当后边需要再次解决同一个子问题的时候就可以直接查表。就比如说:一个馒头太大不能一口吃完,那就分成一小口一小口的吃掉。动态规划的核心是状态转移公式,公式找到了,题也就做了一般了。前边也说了记忆化存储,那么这个记忆化处处就可以用一个列表或者矩阵来表示。原创 2020-11-01 19:52:19 · 92 阅读 · 0 评论 -
一分钟搞懂“哈希表”
可以把哈希表理解为一个数组,每个索引对应一个存储位置,哈希表的索引并不像普通数组的索引那样,从0到length-1,而是由关键字(数据本身)通过哈希函数得到。比如:我们将26个小写字母存储到数组 int a[26]中。那么可以通过哈希函数来将数据本身与索引连接起来,这里我们使用index=key-'a' 作为哈希函数,这样形成的数组就是哈希函数是不固定的,根据数据情况来写的,有时候不同的数据通过运算的结果是一样的,也就是索引是一样的,这样没法进行存储,那么就造成了哈希冲突,解决哈希冲突的方法有很多原创 2020-10-31 10:20:20 · 321 阅读 · 0 评论 -
折半查找简明教程——附代码
折半查找又称二分查找,顾名思义,就是每次将一组已排序的数据取中间位置middle,最低位low,最高位high,与要查找的目标数据进行对比,如果数据比middle数大,就将low坐标移到middle+1;若数据比middle数小,就将high坐标移到middle-1的位置。最终匹配到的一定是middle。int searchInsert(int* nums, int numsSize, int ...原创 2020-03-20 21:35:59 · 413 阅读 · 0 评论