2021.11.24算法笔记
剑指 Offer 64 - II. 求1+2+…+n
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
自己思路:
使用递归思路来解决?不会写伪代码
var sumNums = function(n) {
return n && sumNums(n-1) + n;
};
//答案正确!
知识回忆:逻辑短路
逻辑短路是对于逻辑运算而言,是指,仅计算逻辑表达式中的一部分便能确定结果,而不对整个表达式进行计算的现象。
对于“&&”运算符,当第一个操作数为false时,将不会判断第二个操作数,因为此时无论第二个操作数为何,最后的运算结果一定是false;
对于“||”运算符,当第一个操作数为true时,将不会判断第二个操作数,因为此时无论第二个操作数为何,最后的运算结果一定是true。
剑指 Offer 56 - II. 数组中数字出现的次数
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1: 输入:nums = [3,4,3,3] 输出:4
自己思路: 可去循环判断该数字是否有重复,如果没有重复,那就跳出,找到该数字;
伪代码
var singleNumber = function (nums) {
let length = nums.length;
let count = 0;
for (var i = 0; i++; i < length) {
for (let j = 0; j++; j < legth) {
if (nums[i] == nums[j]) {
count++
}
}
if (count == 1) {
return nums[i]
} else {
count = 0
}
}
};
//错误! 输入 [3,4,3,3] 输出 undefined
解题思路:
1、考虑位运算和+有限状态自动机
考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是3的倍数。 因此,统计所有数字的各二进制位中1的出现次数,并对 3 求余,结果则为只出现一次的数字。
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let res = 0;
for (let i = 0; i < 32; i++) {
// 对于int每一位
let bit = 0;
// 计算该位上的和
for (let num of nums) {
bit += ((num >> i) & 1);
}
// 对3取余即为res在该位的值
res += ((bit % 3) << i);
}
return res;
};
题解链接:
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/
2、双层遍历统计
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function (nums) {
let length = nums.length;
// let count = 0;
flag = true;
for (var i = 0; i < length; i++) {
for (let j = 0; j < length; j++) {
if (nums[i] === nums[j] && i != j) {
flag = false;
break;
}//如果不满足该条件,那自然就是答案了
}
if (flag) {
return nums[i]
} else {
flag = true;
}
}
};
//答案正确!虽然笨了点