[炼手Rust]Hello, World

138 阅读3分钟

hello_world.png

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,该专栏旨在分享各种编程小问题,并通过Rust解决,可能各位小伙伴觉得,这不是OJ吗?不,这里的问题都非常简单,并且非常有趣。我们不卷,我们只提供闲暇时光的快乐Rust。希望各位在这里能快乐玩耍。

这里的宗旨:既有算法,也有玩法。

专栏的所有文章,至少包含如下四部分:

  1. 提问
  2. 分析
  3. 解决方案
  4. Trick

提问:当前有什么问题需要解决。

分析:该问题应该如何解决。

解决方案:提供了方案解决该问题,可能方案有多个,考虑到xiaoK水平有限,可能无法提供最好的解决方案,但xiaoK一定会给出当前解决方案的详细介绍,做到每位读者一看便会。

Trick:Rust小妙招,以及我们学到的经验技巧。

该专栏文章会一直更新,很多读者可能是刚接触Rust,亦或是已经在Rust中摸爬滚打数年,亦或是还没听过这门编程语言,没关系,在我们开始炼手之旅之前,我们先牛刀小试,给两个例子,让各位不熟悉Rust的读者先品尝一下开胃小菜。

Hello, world

提问

编程语言第一步,Hello, world

分析

Rust中,打印字符串是使用的打印宏println!,而字符串在Rust中,是使用的双引号作为包含的。

解决方案

fn main() {
    println!("Hello, world!");
}

Trick

  1. Rust使用宏定义的println!打印字符串。
  2. 双引号包含字符串。

这里有多少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类型,所以在最后,使用asu32转换成usize

Trick

  1. Rust中,函数的最后一行不加;的代码,可以作为返回函数的返回值用,同时,不用写return
  2. 使用位运算操作,进行1的计数,会更快也更简洁。
  3. count_ones函数可以进行专门的二进制1的计数。

以上,便是炼手Rust专栏的第一篇文章,希望读者们喜欢这篇开胃小菜,后续多多支持。