Hi,大家好,这里是炼手Rust专栏,我是xiaoK,该专栏旨在分享各种编程小问题,并通过Rust解决,可能各位小伙伴觉得,这不是OJ吗?不,这里的问题都非常简单,并且非常有趣。我们不卷,我们只提供闲暇时光的快乐Rust。希望各位在这里能快乐玩耍。
这里的宗旨:既有算法,也有玩法。
专栏的所有文章,至少包含如下四部分:
- 提问
- 分析
- 解决方案
- Trick
提问:当前有什么问题需要解决。
分析:该问题应该如何解决。
解决方案:提供了方案解决该问题,可能方案有多个,考虑到xiaoK水平有限,可能无法提供最好的解决方案,但xiaoK一定会给出当前解决方案的详细介绍,做到每位读者一看便会。
Trick:Rust小妙招,以及我们学到的经验技巧。
该专栏文章会一直更新,很多读者可能是刚接触Rust,亦或是已经在Rust中摸爬滚打数年,亦或是还没听过这门编程语言,没关系,在我们开始炼手之旅之前,我们先牛刀小试,给两个例子,让各位不熟悉Rust的读者先品尝一下开胃小菜。
Hello, world
提问
编程语言第一步,Hello, world。
分析
在Rust中,打印字符串是使用的打印宏println!,而字符串在Rust中,是使用的双引号作为包含的。
解决方案
fn main() {
println!("Hello, world!");
}
Trick
Rust使用宏定义的println!打印字符串。- 双引号包含字符串。
这里有多少1
提问
阿峰初到成都,碰到难题:给你一个数N,请求出N在二进制中,有多少个1。
分析
在二进制的世界中,只有0和1,如果要计算一个数有多少1,可以先把他变成二进制的字符串,然后在字符串中,计数1。等等,这个方法又要转换字符串,又要计数,效率岂不是很低?要想很快知道一个数有多少0,多少1,用位运算看最低位,才是最快的!
解决方案
简单易懂
pub fn egg_count(display_value: u32) -> usize {
let mut eggs:usize = 0;
let mut display_value = display_value;
while display_value != 0 {
if display_value & 1 == 1 {
eggs += 1;
}
display_value = display_value >> 1;
}
eggs
}
Rust的独享时刻
pub fn egg_count(display_value: u32) -> usize {
display_value.count_ones() as usize
}
一行代码,在Rust中,有个函数count_ones专门计数二进制中的1,返回结果为u32类型,所以在最后,使用as将u32转换成usize。
Trick
- 在
Rust中,函数的最后一行不加;的代码,可以作为返回函数的返回值用,同时,不用写return。 - 使用位运算操作,进行1的计数,会更快也更简洁。
count_ones函数可以进行专门的二进制1的计数。
以上,便是炼手Rust专栏的第一篇文章,希望读者们喜欢这篇开胃小菜,后续多多支持。