面试题 17.19. 消失的两个数字
难度困难34
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
1 | 输入: [1] |
示例 2:
1 | 输入: [2,3] |
提示:
nums.length <= 30000
原地hash
1 | class Solution { |
难度困难34
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
1 | 输入: [1] |
示例 2:
1 | 输入: [2,3] |
提示:
nums.length <= 30000
1 | class Solution { |
给你两个整数数组 nums1
和 nums2
,请你实现一个支持下述两类查询的数据结构:
nums2
中指定下标对应元素上。nums1[i] + nums2[j]
等于指定值的下标对 (i, j)
数目(0 <= i < nums1.length
且 0 <= j < nums2.length
)。实现 FindSumPairs
类:
FindSumPairs(int[] nums1, int[] nums2)
使用整数数组 nums1
和 nums2
初始化 FindSumPairs
对象。void add(int index, int val)
将 val
加到 nums2[index]
上,即,执行 nums2[index] += val
。int count(int tot)
返回满足 nums1[i] + nums2[j] == tot
的下标对 (i, j)
数目。示例:
1 | 输入: |
提示:
1 <= nums1.length <= 1000
1 <= nums2.length <= 105
1 <= nums1[i] <= 109
1 <= nums2[i] <= 105
0 <= index < nums2.length
1 <= val <= 105
1 <= tot <= 109
add
和 count
函数各 1000
次实际上是两数之和的变种,只是加入HashMap中的数字是会变化的,需要在add的时候更新HashMap,这样的话就跟两数之和没什么区别了。
1 | class FindSumPairs { |
一个数组的 异或总和 定义为数组中所有元素按位 XOR
的结果;如果数组为 空 ,则异或总和为 0
。
[2,5,6]
的 异或总和 为 2 XOR 5 XOR 6 = 1
。给你一个数组 nums
,请你求出 nums
中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。
注意:在本题中,元素 相同 的不同子集应 多次 计数。
数组 a
是数组 b
的一个 子集 的前提条件是:从 b
删除几个(也可能不删除)元素能够得到 a
。
示例 1:
1 | 输入:nums = [1,3] |
示例 2:
1 | 输入:nums = [5,1,6] |
示例 3:
1 | 输入:nums = [3,4,5,6,7,8] |
提示:
1 <= nums.length <= 12
1 <= nums[i] <= 20
1 | class Solution { |
难度中等0
给你一个二进制字符串 s
,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1
。
交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 "010"
和 "1010"
属于交替字符串,但 "0100"
不是。
任意两个字符都可以进行交换,不必相邻 。
示例 1:
1 | 输入:s = "111000" |
示例 2:
1 | 输入:s = "010" |
示例 3:
1 | 输入:s = "1110" |
提示:
1 <= s.length <= 1000
s[i]
的值为 '0'
或 '1'
当字符串的长度是偶数的时候:
n1
n2
Math.min(n1,n2)/2
当字符的长度是奇数的时候(数量多的那个数字一定是字符串的第一个字符):
当1的数量多于0的数量的时候(此时第一个数字应当是1,此时偶数位置为1,奇数位置为0)
当0的数量多于1的数量的时候(此时第一个数字应当是0,此时偶数位置为0,奇数位置为1)
1 | class Solution { |
难度中等262
给你一个整数数组 nums
,返回 nums[i] XOR nums[j]
的最大运算结果,其中 0 ≤ i ≤ j < n
。
进阶:你可以在 O(n)
的时间解决这个问题吗?
示例 1:
1 | 输入:nums = [3,10,5,25,2,8] |
示例 2:
1 | 输入:nums = [0] |
示例 3:
1 | 输入:nums = [2,4] |
示例 4:
1 | 输入:nums = [8,10,2] |
示例 5:
1 | 输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70] |
提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 2^31 - 1
1 | class Solution { |
1 | class Solution { |
给你一个 m x n
的字符矩阵 box
,它表示一个箱子的侧视图。箱子的每一个格子可能为:
'#'
表示石头'*'
表示固定的障碍物'.'
表示空位置这个箱子被 顺时针旋转 90 度 ,由于重力原因,部分石头的位置会发生改变。每个石头会垂直掉落,直到它遇到障碍物,另一个石头或者箱子的底部。重力 不会 影响障碍物的位置,同时箱子旋转不会产生惯性 ,也就是说石头的水平位置不会发生改变。
题目保证初始时 box
中的石头要么在一个障碍物上,要么在另一个石头上,要么在箱子的底部。
请你返回一个 n x m
的矩阵,表示按照上述旋转后,箱子内的结果。
示例 1:
1 | 输入:box = [["#",".","#"]] |
示例 2:
1 | 输入:box = [["#",".","*","."], |
示例 3:
1 | 输入:box = [["#","#","*",".","*","."], |
提示:
m == box.length
n == box[i].length
1 <= m, n <= 500
box[i][j]
只可能是 '#'
,'*'
或者 '.'
。1 | class Solution { |
显示英文描述
给你两个整数 memory1
和 memory2
分别表示两个内存条剩余可用内存的位数。现在有一个程序每秒递增的速度消耗着内存。
在第 i
秒(秒数从 1 开始),有 i
位内存被分配到 剩余内存较多 的内存条(如果两者一样多,则分配到第一个内存条)。如果两者剩余内存都不足 i
位,那么程序将 意外退出 。
请你返回一个数组,包含 [crashTime, memory1crash, memory2crash]
,其中 crashTime
是程序意外退出的时间(单位为秒), memory1crash
和 memory2crash
分别是两个内存条最后剩余内存的位数。
示例 1:
1 | 输入:memory1 = 2, memory2 = 2 |
示例 2:
1 | 输入:memory1 = 8, memory2 = 11 |
提示:
0 <= memory1, memory2 <= 2^31 - 1
1 | class Solution { |
一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。
我们可以给一个句子添加 从 1 开始的单词位置索引 ,并且将句子中所有单词 打乱顺序 。
"This is a sentence"
可以被打乱顺序得到 "sentence4 a3 is2 This1"
或者 "is2 sentence4 This1 a3"
。给你一个 打乱顺序 的句子 s
,它包含的单词不超过 9
个,请你重新构造并得到原本顺序的句子。
示例 1:
1 | 输入:s = "is2 sentence4 This1 a3" |
示例 2:
1 | 输入:s = "Myself2 Me1 I4 and3" |
提示:
2 <= s.length <= 200
s
只包含小写和大写英文字母、空格以及从 1
到 9
的数字。s
中单词数目为 1
到 9
个。s
中的单词由单个空格分隔。s
不包含任何前导或者后缀空格。1 | class Solution { |
难度简单267
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
1 | 输入: nums = [1,2,3,1], k = 3 |
示例 2:
1 | 输入: nums = [1,0,1,1], k = 1 |
示例 3:
1 | 输入: nums = [1,2,3,1,2,3], k = 2 |
巧妙之处在于一直加入数字,如果当前的set的size() > k说明最后一个加入元素的index与第一个元素加入的index差值大于k了,此时要把第一个加入的元素删掉
如果某次查找时当前元素在set里面说明有一个元素与当前元素的index差值不超过k,此时满足条件,跳出
1 | class Solution { |
难度困难764
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
进阶:你可以设计并实现时间复杂度为 O(n)
的解决方案吗?
示例 1:
1 | 输入:nums = [100,4,200,1,3,2] |
示例 2:
1 | 输入:nums = [0,3,7,2,5,8,4,6,0,1] |
提示:
0 <= nums.length <= 104
-10^9 <= nums[i] <= 10^9
使用哈希表来做visited
,然后向前向后统计数量
visited==1
,那么就不再遍历了。visisted==0
那么就向前向后遍历统计数量。1 | class Solution { |
1 | class Solution { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true