7

1295. 统计位数为偶数的数字

Hi 大家好,我是张小猪。欢迎来到『宝宝也能看懂』系列之 leetcode 周赛题解。

这里是第 168 期的第 1 题,也是题目列表中的第 1295 题 -- 『统计位数为偶数的数字』

题目描述

给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。

示例 1:

输入:nums = [12,345,2,6,7896]
输出:2
解释:
12 是 2 位数字(位数为偶数)
345 是 3 位数字(位数为奇数)
2 是 1 位数字(位数为奇数)
6 是 1 位数字 位数为奇数)
7896 是 4 位数字(位数为偶数)  
因此只有 12 和 7896 是位数为偶数的数字

示例 2:

输入:nums = [555,901,482,1771]
输出:1
解释:
只有 1771 是位数为偶数的数字。

提示:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 10^5

官方难度

EASY

解决思路

题目内容很简单,就是返回数组中长度为偶数的数字的数量。顺着思路,很容易就能想到最直接方案,也就是对于数组里的每一个数字,获取它的长度,然后做判断即可。

直接方案

基于以上思路,那么接下来问题便是如何获取长度呢?

一种方式,想到长度可能会联想到字符串,而 JS 中数字转化为字符串很容易。于是我们得到第一种实现代码。

const findNumbers = nums => {
  let ret = 0;
  for (let i = 0; i < nums.length; ++i) {
    (nums[i].toString().length & 1) === 0 && ++ret;
  }
  return ret;
};

另一种方式,我们也可以直接基于数字计算得到对应的长度。这里用到了几个简单的位运算来做处理,当然也可以不用,替换为相应的其他方式即可。

const findNumbers = nums => {
  let ret = 0;
  for (let i = 0; i < nums.length; ++i) {
    let len = 0;
    for (let val = nums[i]; val > 0; ++len) {
      val = val / 10 >> 0;
    }
    (len & 1) === 0 && ++ret;
  }
  return ret;
};

换个思路

做到这里其实本来也差不多了,正打算收尾的时候,突然注意到限制条件里给出的每个数字的取值范围 [1, 10^5]
乍一看好像挺大,然而我们这里是要长度为偶数的数字,其实在范围内的也就两段 [10, 99][1000, 9999]。这下好了,也不用取长度了,直接判断范围即可。

const findNumbers = nums => {
  let ret = 0;
  for (let i = 0; i < nums.length; ++i) {
    const val = nums[i];
    ((val > 9 && val < 100) || (val > 999 && val < 10000)) && ++ret;
  }
  return ret;
};

总结

作为 168 期周赛的第一题,难度比较简单。不过这道题能够提醒我们,在处理具体问题的时候,有时可以根据数据的条件和范围来给出更简单的策略。

相关链接

qrcode_green.jpeg


张小猪粉鼻子
2.9k 声望407 粉丝

一只粉色的小猪,喜欢写写代码,看看电影,玩玩游戏社恐,不太会讲话永远跟不上热点