摘要: 可以利用栈的性质,遍历链表,把节点存入栈中,然后一个一个弹栈,连接成新链表。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : v 阅读全文
posted @ 2020-08-04 22:27 machine_gun_lin 阅读(57) 评论(0) 推荐(0)
摘要: 既然同一个字符如果要替换,就都得替换成相同的字符,我们可以开哈希表记录某个字符映射成了哪个别的字符,但是由于两个字符不能映射到相同的字符上,如果a映射成o,r也映射成o,那么bar就可以替换成foo了,这是不符合题意的。 我们注意到,如果我们对foo也建立一个哈希表,那么o只能映射成一个字符,foo 阅读全文
posted @ 2020-08-04 19:28 machine_gun_lin 阅读(77) 评论(0) 推荐(0)
摘要: 暴力计算所有小于n的数中的素数个数。 class Solution { public: bool isPrime(int n) { if(n == 2) { return true; } for(int i = 2; i * i <= n; ++i) { if(n % i == 0) { retur 阅读全文
posted @ 2020-08-04 18:52 machine_gun_lin 阅读(99) 评论(0) 推荐(0)
摘要: 链表的“删除”,往往采用的是跳过的方式,即如果p → next是我们要“删除”的节点,我们只要把p的next指针指向p → next → next就可以了,也就是让链表跳过p → next,让这个节点“社会性死亡”。 根据这个思路,这一题里我们只需要遍历链表,判断节点值是否与我们要删除的相等,如果相 阅读全文
posted @ 2020-08-04 18:10 machine_gun_lin 阅读(72) 评论(0) 推荐(0)
摘要: 按照题目说的规则,不是快乐数的数,会陷入无限循环,永远得不到1,比如18,在第4次迭代的时候计算出来的n是58,在第12次迭代之后n的值还是58,所以就陷入了无限循环之中,所以18不是快乐数。 因此,我们可以用一个set,对于每一次迭代就算出来的n,都先去判断set中是否已经存在这个值了,如果已经存 阅读全文
posted @ 2020-08-04 17:48 machine_gun_lin 阅读(112) 评论(0) 推荐(0)
摘要: 暴力做法是,枚举从m~n的所有数,因为题目说了数据最大为2147483647,所以可以枚举0~30位,对所有数字的每一位做与运算。 数据比较大的时候这样做会超时(时间复杂度是O(n))。 参考官方题解,有一个简单得多的做法。 观察发现,要对所有数做按位与,只要有一个数的某一位为0,则最后按位与的结果 阅读全文
posted @ 2020-08-04 17:25 machine_gun_lin 阅读(161) 评论(0) 推荐(0)
摘要: 非常经典的搜索问题。遍历数组,从每一个1开始深度优先搜索当前位置联通的位置是否都是1(也就是与它联通的陆地),用一个额外的布尔数组visited记录每一个位置的元素是否已经访问过,每个遍历过的位置visited都标记为true。 代码如下: class Solution { public: vect 阅读全文
posted @ 2020-08-04 16:46 machine_gun_lin 阅读(82) 评论(0) 推荐(0)
摘要: 二叉树层次遍历,用一个数组记录每一层的最右边的元素。 class Solution { public: vector<int> rightSideView(TreeNode* root) { if(root == NULL) { return {}; } vector<int> res; queue 阅读全文
posted @ 2020-08-04 16:16 machine_gun_lin 阅读(77) 评论(0) 推荐(0)
摘要: 用dp[i]表示打劫到第i个房子(i从0开始)时能获取到的最高金额,显然对于第i个房子,我们有打劫和不打劫两种方案。 如果不打劫第i个房子,那么到第i个房子能获取的最高金额和到第i - 1个房子能获取到的最高金额是一样的(因为到了第i个房子这里没有收入嘛)。因此我们有dp[i] = dp[i - 1 阅读全文
posted @ 2020-08-04 16:04 machine_gun_lin 阅读(70) 评论(0) 推荐(0)
摘要: 循环,逐位判断每一位是不是1。 class Solution { public: int hammingWeight(uint32_t n) { int res = 0; for(int i = 0; i < 32; ++i) { res += (n >> i & 1) == 1 ? 1 : 0; 阅读全文
posted @ 2020-08-04 15:48 machine_gun_lin 阅读(42) 评论(0) 推荐(0)
摘要: 颠倒一个32位无符号整数的二进制位,因为它只有32位,所以我们可以用一个循环,从最低位开始获取它的当前位的数字,然后循环32次把数字加到一个新的32位无符号整数上,然后返回这个32位无符号整数就ok。 对于数字n,要获取最低位的数字就是 n & 1,也可以理解为n >> 0 & 1,意思就是n的二进 阅读全文
posted @ 2020-08-04 15:42 machine_gun_lin 阅读(69) 评论(0) 推荐(0)
摘要: 要右移k次,且只能用O(1)的空间,最简单的办法是循环k次,每次用一个变量temp记录最后一个位置的值,然后让最后一个下标(下标从0开始)到下标1的值都为前一个元素的值,再让下标0的值为temp。 这样进行k次之后,就完成了循环右移k次。 不过这样会超时,一个较简单的做法是,对于右移到数组前边的k个 阅读全文
posted @ 2020-08-04 15:28 machine_gun_lin 阅读(65) 评论(0) 推荐(0)