[刷题记录] 剑指 Offer 64 - II. 求1+2+…+n 和 剑指 Offer 56 - II. 数组中数字出现的次数

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;
       }
   }
   };
   //答案正确!虽然笨了点

你可能感兴趣的:([刷题记录] 剑指 Offer 64 - II. 求1+2+…+n 和 剑指 Offer 56 - II. 数组中数字出现的次数)