不吐不快:依旧是不想写论文的一天,终于把第二章基本写完了,还是愉快地刷题。但是今天力扣
1295统计位数为偶数的数字
的时候,十分想用迭代器写法,但是突然发现不怎么会统计位数,于是我使用AI帮我搜了一下,发现了一些惊为天人的方法(在我这里看来惊为天人,各位大佬肯定习以为常~)
常见的统计位数有两种方法,分别是逐位统计,或者转换为字符串求长度,那么还有其他的吗?
有的兄弟,有的。
废话不多说,我先把今天我遇到的一个题贴在这里。
1295. 统计位数为偶数的数字 - 力扣(LeetCode)
题目:给你一个整数数组
nums
,请你返回其中位数为偶数的数字的个数。
示例1:输入:nums = [12, 345, 2, 6, 7896]
输出:2
解释:
12 是 2 位数字(位数为偶数)
345 是 3 位数字(位数为奇数)
2 是 1 位数字(位数为奇数)
6 是 1 位数字 位数为奇数)
7896 是 4 位数字(位数为偶数)
因此只有 12 和 7896 是位数为偶数的数字
整个题目实际上是很简单的,但是我想用迭代器来写。
我先放一个我自己的版本:
Rust
impl Solution {
pub fn find_numbers(nums: Vec<i32>) -> i32 {
nums.iter()
.filter(|&x|) {
x.to_string().len() % 2 == 0
}
.count() as i32
}
}
一个平平无奇的字符串方法,或者你也可以用逐位统计的方法,while循环到底。
但是这里我突然发现可以使用log10
,也就是把数字取对数,这个方法我还没查过效率是多少,但应该会比while高一些,个人感觉。如果有感兴趣的朋友可以测试一下。
代码我贴在下边:
Rust
impl Solution {
pub fn find_numbers(nums: Vec<i32>) -> i32 {
nums.iter()
.filter(|&x| {
if *x == 0 {
return false;
}
let num = x.abs();
let digits = (num.ilog10()+1) as usize;
digits % 2 == 0
})
.count() as i32
}
}
通过i32中的ilog10
方法,同样能够实现统计位数的操作,不错不错,奇怪的知识又增加了!
好了,一个简单的问题就被我这么复杂的想了出来!
祝各位行行代码无BUG,次次科研出成果!