Rust-如何快速统计一个数字的位数

不吐不快:依旧是不想写论文的一天,终于把第二章基本写完了,还是愉快地刷题。但是今天力扣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,次次科研出成果!

相关推荐
Patrick_Wilson12 小时前
sccache 用在 Rust 上为什么常「不省编译」:原理、限制与 Windows 接入
ci/cd·rust·编译器
k4m7v2pz18 小时前
rvs 26.8.43 → 26.8.53 更新概览:MCP 落地、审计增强与谬误澄清
rust·repl·mcp server·rust-verb-shell·rvs·shell 工具
程序员爱钓鱼19 小时前
Rust impl详解:为Struct定义方法与关联函数
前端·后端·rust
k4m7v2pz19 小时前
Rust 程序在 ReactOS 上“加载即崩“:从崩溃地址 0x6107104d 到 CRT 依赖的深度排查
rust·交叉编译·逆向工程·reactos·pe格式·windows兼容
Thneonl1 天前
一个人从 Rust 内核做到 React 前端:我做了一个云原生 SRE 巡检图谱桌面工具
rust
程序员爱钓鱼1 天前
Rust Struct结构体详解:定义自己的复杂数据类型
后端·面试·rust
苏灿烤鱼2 天前
公司**不可计算,就自己做操作系统
rust·typescript·agent
nnerddboy2 天前
Rust教程04:引用、借用与切片
开发语言·后端·rust
咸甜适中2 天前
rust语言AI编程学习笔记(五)clap命令行参数解析
学习·rust·ai编程
梦醒沉醉2 天前
19、Rust程序设计语言——高级特性
rust