吃过晚饭, 没啥事, 随手做了两道题, 都是easy 级别的, 在这也给大家伙看看。
7 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
在下就喜欢做这种简单的题, 小手一挥, 就写出了几行代码:
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
var isPositive = x >= 0, result;
var temp = isPositive ? x : -x
var t2 = (temp + '').split('').reverse().join('') - 0;
result = isPositive ? t2 : -t2
if(result > 2147483647 || result < -2147483648 ) {
return 0;
} else {
return result;
}
};
一提交, Beat 89.45%, 嘴角微微上扬 :)
高兴不过三秒, 发现情况不对:
这一波字符串操作, 看起来很溜, 内存只存储得下一个32 位的有符号整数。
字符串的链式调用内部进行了至少三重循环, 这么下去肯定是不行的。得改:
var reverse = function(x) {
var y = 0;
if (x >= 0) {
while (x > 0) {
if (y > 214748364 || y === 214748364 && x % 10 > 7) {
return 0
}
y = y * 10 + x % 10
x = x / 10 | 0
}
return y
} else {
x = -x
while (x > 0) {
if (y > 214748364 || y === 214748364 && x % 10 > 8) {
return 0
}
y = y * 10 + x % 10
x = x / 10 | 0
}
return -y
}
};
这样应该就可以了.
448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n (n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗?
你可以假定返回的数组不算在额外空间内。
示例输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗?
不能, 不能惯着你,我就要用额外空间。
上来就是一顿暴力操作:
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
var length = nums.length;
// step1: 获得标准的数据范围, 比如输入的是[1,1], 那对应的标准结果就是[1,2]
var result = [...Array(length + 1).keys()]
result.splice(0, 1);
// step2: 将出现的数字标记为 0
for(var i = 0 ; i < length; i++) {
var current = nums[i]
if(result[current - 1]) {
result[current - 1] = 0; // 出现过就标记为 0
}
}
// step3: 遍历result, 取出不为 0 的数字即为最终结果
return result.filter(v => v !== 0)
};
回头再来看条件限制: 不使用额外空间且时间复杂度为O(n)
不是很好搞, 我先回去想想,做出来之后再提出来, 大家也可以留言讨论。
好了,假定返回的数组不算在额外空间
这句很关键, 思考了一下之后, 有了如下代码:
var findDisappearedNumbers = function(nums) {
var result = [];
for(var i = 0; i < nums.length; i++) {
var index = nums[i] > 0 ? nums[i] : -nums[i];
index -= 1;
if(nums[index] > 0) {
nums[index] = -nums[index]
}
}
for(var i = 0; i < nums.length; i++) {
var currentItem = nums[i];
if(currentItem > 0) {
result.push(i+1)
}
}
return result
};
思路也很简答, 把出现的数字当成下标(要减1), 一遍循环之后。 没有没处理到的元素都是大于0的, 这些元素的index + 1 的值。 即是我们需要的结果。
同桌看到我在做这个题之后, 讨论了一下, 给出了他的实现, 也只置换的思想:
unc findDisappearedNumbers(nums []int) []int {
temp := 0
for index := range nums {
temp = nums[index]
if temp == 0 || temp-1 == index {
continue
}
nums[index] = 0
for temp != 0 && temp != nums[temp-1] {
stash := nums[temp-1]
nums[temp-1] = temp
temp = stash
}
}
result := make([]int, 0)
for index, item := range nums {
if item == 0 {
result = append(result, index+1)
}
}
return result
}
欢迎留言讨论。
以上 :)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。