- 博客(88)
- 资源 (14)
- 收藏
- 关注
原创 82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。 返回同样按升序排列的结果链表。 第一遍理解错了,以为是把链表中重复出现的值删除只剩一个。提交代码后,发现理解错了。然后重新写了代码,卡在一个点,提交的代码一直不是自己想要的,甚至在纸上写都感觉代码没有问题。今天早上,简单看下,就发现问题在哪里。 这提醒我们,脑袋高糊的时候不要跟自己过不去,该休息休息。直接上代码 func deleteDuplicates(..
2021-09-07 22:40:37
196
原创 242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若s 和 t中每个字符出现的次数都相同,则称s 和 t互为字母异位词。 拿到这一题,第一感觉就是hash实现,直接上代码 func isAnagram(s string, t string) bool { if len(s) != len(t){ return false } m := make(map[byte]int, len(s)) for i:=0;i<len(s);i++{ ...
2021-08-26 23:22:05
181
原创 234. 回文链表
给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。 拿到这个题的第一念头,就是将链表数据copy到数组中,根据下标判断这个数组是否是回文,进而得到链表的结果。这个方法很简单,我专门看了下本地的挑战点,是说时间复杂度o(n),空间复杂度o(1),那这样怎么计算呢,不管我是重建数组还是重建链表,都需要空间。然后我就考虑申请两个变量,count计数变量、newHead空头指针, 1、遍历链表,获取链表长度count 2、遍历链表,访问到中间...
2021-08-25 23:00:59
219
原创 237. 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为要被删除的节点。 这一题有两个坎: 1、理解题意,熟练查看题目中的各种条件 2、理解函数,这个函数不传链表的头指针,只传要删除的节点,也不返回。 当时纠结了好久,要删除node,在不知道node节点的前一个节点的情况下,是没办法进行删除的,因此久久没有思路。最终看了思路,因为链表中各个节点的Val值不同,考虑更换node和node.Next的Val值,删除node.Next,其实这一题最重要的就是思路思路!!! ..
2021-08-25 23:00:06
149
原创 226. 翻转二叉树
可能是受到学生时代的影响,我一直对于树和图都比较不喜欢的,总感觉理不清。拿到这一题,细看示例后,意识到这就是将所有的左右节点都进行交换,直接凭借着直觉就写下了代码:从根节点开始翻转左右两个节点,依次到叶子结点,一提交,发现真的没有问题,哈哈哈哈(不过这个代码的第一版,我先判断了左右节点是否为空,多此一举) func invertTree(root *TreeNode) *TreeNode { if root == nil{ return nil } t := root.Left roo...
2021-08-21 17:26:34
125
原创 231. 2 的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得n == 2x ,则认为 n 是 2 的幂次方。 这样的题目,大家拿到手都不会一筹莫展,第一个想法就是暴力解法,不出意外,直接提交超时 func isPowerOfTwo(n int) bool { for i:=0;i<=n/2;i++{ if math.Pow(2, i) == n{ return true } } return fal.
2021-08-19 23:24:39
238
原创 228. 汇总区间
给定一个无重复元素的有序整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按如下格式输出: "a->b" ,如果 a != b "a" ,如果 a == b 其实这一题拿到的时候,我是有些没有思路的,但是想到求一个字符串最长不重复子串问题中,有两个指针分别指向符合条件区间的左区间和右区间,所以我做了如下操作,用
2021-08-18 23:50:10
131
原创 219. 存在重复元素 II
给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且 i 和 j的差的 绝对值 至多为 k。 拿到这道题,最直观的想法就是二层循环实现,直接上代码 func containsNearbyDuplicate(nums []int, k int) bool { for i:=0;i<len(nums);i++{ for j := i+1;j<=k+i&&j<len(nums);j++{ ...
2021-08-17 23:28:43
138
原创 217. 存在重复元素
给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。 这样的题目比较简单,两种思路:1、先排序,比较相邻数据;2、使用hash表,习惯性用hash表,直接上代码 func containsDuplicate(nums []int) bool { flag := make(map[int]bool) for i:=0;i<len(nums);i++{ if flag[nums[i]] == 1...
2021-08-13 23:50:52
113
原创 206. 反转链表
给你单链表的头节点head,请你反转链表,并返回反转后的链表。 总感觉大学的时候链表学的不错,仅限于单链表的操作就还不错。但是突然想到,像是判断链表环啊什么的,还真是没啥想法 但是这个题就是会,直接上代码 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reverseList(head *ListNode) ..
2021-08-12 22:55:55
123
原创 205. 同构字符串
给定两个字符串s和t,判断它们是否是同构的。 如果s中的字符可以按某种映射关系替换得到t,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。 其实从这个描述中,我能读到s->t的映射是不重复的,但是我读不出t->s的映射也要不重复的,所以我写的代码1.0,代码提交失败"badc"- "baba"不满足 func isIsomorphic(s str...
2021-08-11 00:13:05
149
原创 202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。 我的想法很简单,就是所有的数最终都会变成0-9(待验证,直觉哈哈哈),基于此,写了如下算法,没想到还通过了 func isHappy(n int) bool { for n >..
2021-08-09 23:50:30
128
原创 204. 计数质数
统计所有小于非负整数n的质数的数量。 拿到这一题,是有思路的,也就是穷举法,写出来提交后提示超时,直接上最简单的代码 func countPrimes(n int) int { if n < 2{ return 0 } count := 0 for i:=2;i<n;i++{ if isPrimes(i){ count++ } } return count } func isPrimes(n int)bool{ if n < 2{ retur..
2021-08-09 23:19:55
126
原创 169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 最笨的方法就是申请一个数组记录每个元素出现的次数,最后遍历这个数据取出数据最大的,但是第一感觉这是个笨方法。 考虑到go的map,可以直接统计到同一个key,上代码 func majorityElement(nums []int) int { visited := make(map[int]int, len(nums)/2+1..
2021-08-06 00:09:07
118
原创 201. 数字范围按位与
给你两个整数left和right,表示区间[left, right],返回此区间内所有数字按位与的结果(包含left、right端点)。 第一思路,上来就来,但是超时了,哈哈哈 func rangeBitwiseAnd(left int, right int) int { result := left for left <= right{ result = result & left left++ } return result } 然后我的脑子就...
2021-08-04 23:41:09
123
原创 203. 移除链表元素
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点。 普通的链表操作是我比较熟悉的一个点,所以引入了两个指针,但看官方思想,可以不引入多个指针,直接一个变量即可以,可以用next表示实现 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ f...
2021-08-03 23:07:19
118
原创 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 考虑用这个末尾的数字与1进行与运算,为1,count++;否则不增加; 每次运算num>>1右移一位,上代码 func hammingWeight(num uint32) int { count := 0 for num != 0{ if num & 1 == 1{ count++ } num =
2021-08-03 22:50:16
140
原创 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。 对于这个题目的类型有所误解,所以做的答案有些不对,首先将十进制数转换为二进制再转换为十进制,可能未理解题目的意思 func reverseBits(num uint32) (res uint32) { var result []uint32 for num != 0 { result = append(result, num%2) num = num / 2 } var mul uint32 = 0 for i := len(resul
2021-08-02 23:46:06
202
原创 172. 阶乘后的零
给定一个整数n,返回n! 结果尾数中零的数量。 首先这一题的思路:想要有0出现,得有2和5同时出现;因为5比2大,所以2一定比5先出现多。也就是5的个数也就是0出现的次数。 基于这个思路,写了1.0算法,感觉这个两层循环不合理 func trailingZeroes(n int) int { if n < 5{ return 0 } count := 0 for i:=5;i<=n;i=i+5{ num := i for num % 5 == 0{ coun..
2021-07-29 23:12:33
109
原创 二叉树的右视图
二叉树的右视图 给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 这一题理解了以后也就不难,但刚开始接触这一题的时候,思路不太正确,甚至连广度遍历用队列都忘记了,还需要多操作,多联系,继续努力,下面来说这道题的思路: 我们以队列的方式存储每一层节点,当根节点不为空时,先进行入队列的操作。 循环的终止条件是队列不为空,我们这一层节点的所有左右子节点都入队列,通过内层循环来保证; 因为我们是先入右节点的,所以i=0即是右视图看到的值; 当..
2021-07-28 23:33:27
133
原创 Excel表列序号
给定一个Excel表格中的列名称,返回其相应的列序号。 这就相当于给一个N进制数,求十进制数,只是这个N进制数是用字母表示。基于这种思路,我就写出了第一个算法:先用map表示26个字母对应的数值,然后进行依次求和运算(私下窃喜自己没有单个的赋值每一个字母,而是用了一个循环,但是看了官方说明才发现纯粹是多此一举) func titleToNumber(columnTitle string) int { intMapCha := make(map[byte]int, 26) for i :=0;i&l
2021-07-27 23:19:47
160
原创 Excel表列名称
给你一个整数columnNumber,返回它在 Excel 表中相对应的列名称。 首先这个数字是A-Z,AA-AZ,BA-BZ。。。ZA-ZZ。。。依次增1的列名称,且A代表1。 在自己思考的过程中,考虑过用位转换的想法,但是没有想到是十进制转26进制,且26进制是从1开始,没有0,所以有-1操作 最后在输出时,还是要逆序输出的 func convertToTitle(columnNumber int) string { var res []byte for columnNumber &g..
2021-07-26 22:44:50
316
原创 找出两个链表的相交点
给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。 这道题自己解的时候是最笨的思路,先分别求出两个链表的长度,以短链表的长度作为循环的结束条件,以此与另一个链表比较,相等则返回,不相等长链表到末尾,短链表下移。最笨的方法,所以提交的效率也很低,直接见代码 func getIntersectionNode(headA, headB *ListNode) *ListNode { if headA == nil || he...
2021-07-25 17:26:16
360
原创 顺时针打印数组
一个实现过程很艰难的题目,思路是有的,但是在设置一些参数的边界时,就经常出问题,最终代码调通,在这里说下几点 总体思路: 用一个变量direction来控制方向,1右,2下,3左,4上; 用top,right,down,left来控制访问的边界,在设置边界初始值时,要好好考虑,我这里没次到达边界时,代表的就是不可访问的值,所有这四个的边界值为-1,len2,len1,-1 用count来作为循环的结束条件(这里应该是也可以top、right、left、down来控制条件终止的) 访问元素的下标用r
2021-07-24 23:53:59
99
原创 一个有序数组求twoSum
看到这个题,我理解跟之前那个解法并没有区别,可能有区别,但是我在leetcode上提交成功了。因为是有序数组,所有也可以双指针去做这件事情,附上map思路代码 func twoSum(numbers []int, target int) []int { result := make(map[int]int) for key, value := range numbers{ if kk, ok := result[target-value];ok{ return []int{kk+1, ke
2021-07-21 23:45:35
129
原创 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现一个栈,最开始想着用一个值作为最小值,忘记出栈操作后这个值就会丢了;后来minStack初始化的时候,直接初始化为空数组了,也会有问题;要注意的是,push操作,stack和minStack都有一次push操作 type MinStack struct { minStack []int stack []int } /** initialize your data structure here. */ func Constructor() MinStack { return MinStack
2021-07-21 23:23:05
488
原创 求得有环链表中的相交点
快慢指针思路:思路有一个推理公示在里面,慢指针和快指针相遇是在环内相遇的,用a表示head到环起点的距离,b表示起点到相遇点的距离,c表示相遇点到环起点的距离 先求快指针遍历过的长度:a+(n+1)b+nc 慢指针遍历过的长度:a+b 快慢指针有2倍的关系 2(a+b)=a+(n+1)b+nc=> a=(n-1)b+nc=c+(n-1)(b+c) 含义即是:a的距离就是c的距离+n倍的环的长度,所以可写出如下代码: /** * Definition for singly-linked.
2021-07-18 16:09:35
110
原创 判断链表中是否有环
就是快慢指针的逻辑,直接附代码 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func hasCycle(head *ListNode) bool { if head == nil || head.Next == nil{ return false } p := head q := head.Next for
2021-07-18 15:30:44
96
原创 求一组数组中的唯一出现的一个数
给你一个整数数组nums,除某个元素仅出现一次外,其余每个元素都恰出现三次 。请你找出并返回那个只出现了一次的元素。 func singleNumber(nums []int) (value int) { result := make(map[int]int) for i:=0;i<len(nums);i++{ result[nums[i]]++ } for k := range result{ if result[k] == 1{ value = k ...
2021-07-16 23:16:43
136
原创 判断数组中仅出现一次的数
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 通过这个算法题,感觉要熟练使用异或运算,在很多场景下是最能直接解决问题的 //第一错觉想法,忽略每一个数的前一个符号并不是符合自己预期的那样+-,所以结果很可能不符合预期 func singleNumber(nums []int) int { sum := 0 for i:=0;i<len(nums);i++{ if i % 2 == 0{ sum += nums[i] }e
2021-07-16 22:53:04
373
原创 判断一个字符串是否是回文的
最开始考虑的是过滤掉非数字非字母字段,然后判断这个数组是否是回文的,但是没有考虑大写转小写,还是出问题了 func isAlnum(c byte)bool{ if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'){ return true } return false } func isPalindrome(s string) bool { var s1 string s =
2021-07-15 23:50:58
123
原创 268. 丢失的数字
给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。 因为今天遇到一个类似的题目,当时就按照这种思路去做题了,写完了提交不成功,拿失败用例测试才发现,这种方法并不能保证在一轮结束后,序列变成一个有序序列,很蠢的一种做法,甚至不如直接来个排序,见代码 func missingNumber(nums []int) int { for i:= 0; i<len(nums);i++{ if nums[i] != i &&...
2021-07-13 00:04:41
97
原创 实现一个LRU缓存机制
设计一个lru机制,首先是思路: 首先用一个双向链表来存储一个节点 type DLinkNode struct{ key, value int pre, next *DLinkNode } 整个LRU包括当前长度、容量、头节点、尾节点、hash存储 type LRUCache struct { size int capacity int cache map[int]*DLinkNode head, tail *DLinkNode } 数据结构定义好以后,就是操作了,主要包括,初始
2021-07-11 21:11:59
491
原创 反转单链表
这里有一点要注意的是,p的next要在t复制next之前,否则的p的next会发生改变,详情见代码 package main import . "nc_tools" /* * type ListNode struct{ * Val int * Next *ListNode * } */ /** * * @param pHead ListNode类 * @return ListNode类 */ func ReverseList( pHead *ListNode ) *List
2021-07-11 17:10:56
102
原创 面试合集记录之一
1、构建一种死锁的场景 线程T1需要先后访问资源A和B,线程T2需要先后访问资源B和A; T1先对A进行上锁处理,T2先对B进行上锁处理;T1在访问B时,B被占用,进入阻塞;T2在访问A时,A被占用,进入阻塞 2、 ...
2021-07-11 14:55:20
179
原创 杨辉三角二leetcode
给定一个数值,返回该值+1行对应的值,跟上一题的区别是我们不需要申请一个二维数组去存储这所有的值,只需要两个一维数组在保存当前的值及前一行的值,代码如下: 注意2点: 1、i的下标要取到rowIndex 2、pre每次被赋值为cur func getRow(rowIndex int) []int { var pre, cur []int for i:=0;i<=rowIndex;i++{ cur = make([]int, rowIndex+1) cur[0] = 1 cur
2021-07-10 17:37:47
89
原创 杨辉三角输出leetcode
杨辉三角大家都知道是什么,可能早期学C语言的时候也都写过代码输出这些值 所以看到这个题也没有感觉很难,但是自己在写代码的时候遇到一些问题 1、针对结果返回,make的时候要申请二维数组的空间 2、在每一次循环时,要申请对应一维数组的空间,而且下标i代表第i+1行,所以每次申请空间的时候要申请i+1 3、j代表每一列的值,它的终止条件看的是i func generate(numRows int) [][]int { result :=make([][]int, numRows) for i:=
2021-07-10 16:58:49
154
原创 路径总和leetcode
对一棵树进行遍历,从根节点到叶子结点遍历节点的和如果等于目标值sum,返回true,否则返回false,递归算法如下所示 如果根节点为空,返回false 如果根节点没有左右子树,判断sum与根节点的值是否一致,一致返回true 否则,对根节点的左子树和右子树进行遍历 /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right
2021-07-10 16:32:40
115
原创 求二叉树的最小深度
求一颗二叉树的最小深度,考虑以下情况 如果根节点为空,返回0; 如果根节点无左右子节点,返回1; 否则,如果左节点不为空,返回左子树和最小值的更小值;如果右节点不为空,返回右子树和最小值的更小值 时常温习下吧,哈哈哈哈哈 /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
2021-07-09 23:11:58
196
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅