Go 转 Rust 很难 ,面试也逃不过手撕算法!

大家好,我是渔夫。

今天分享主题,最近有位伙伴面试 Rust 岗位要求手撕算法了,心想 Rust 学习起来够费劲了,应该没有算法环节,没想到还是逃不过。

这位伙伴之前经验,在广州某家做虚拟化存储方向,主要是 Go 开发,也写 C/C++ 不过相对较少。这次跳槽就是想上班自由,所以就找个远程公司,刚好找到一个纯 Rust 开发的。

面试开始!

一位体态丰腴,身着格子衫中年男,手持一台布满划痕的 MacBook 向我缓步走来,看着快秃顶的头发,让人不禁暗自猜测,肯定是位资深的顶级架构师。

看了眼简历,咱们直接开门见山,先来个简单点算法题热身吧。

Go版本:两个 goroutine 交替执行打印数字和字母

你之前是写 Go 语言的嘛,先尝试用 Go 实现两个 goroutine 交替执行打印数字和字母。

var ch1 = make(chan bool,1)
var ch2 = make(chan bool)
func f() {
	ch1 <- true
	for i:=1;i<=10;i+= 2{
		<- ch1
		fmt.Print(i)
		fmt.Print(i+1," ")
		ch2 <- true
	}
}
func f2() {
	for i:='A';i<='J';i+=2{
		<- ch2
		fmt.Print(string(i))
		fmt.Print(string(i+1)," ")
		ch1 <- true
	}
}

func main() {
	go f1()
	go f2()
	time.Sleep(time.Second)
}

然后,期间问些八股文的题,如下:

八股文

  • 你为什么要转 Rust ,它有什么好处?

  • 你是如何使用 Cargo 创建新的 Rust 项目?

  • 解释一下 Rust 的所有权模型?

  • Rust 中什么是借用?

  • Rust 中如何使用堆栈和堆?

  • 你如何看待,为什么 Rust 不使用垃圾收集器?

  • 如何使用 Cargo 构建和测试 Rust 代码?

  • 如何将普通 Rust 程序转换为 Cargo 兼容程序?

  • Rust 宏是什么?它与函数有何不同?

  • 解释 Rust 中的错误处理。

  • Rust 中_mut_关键字的用途是什么?

  • Rust 中如何声明全局变量?

  • Cargo.lock 文件有什么用途?

  • Cargo.lock 文件有什么用途?

  • 为什么您可能在 Rust 中使用不安全的代码,有哪些风险?

  • Rust 如何处理并发?

八股文回答差不多了,面试说,那我们今天面试差不多了,再来一天算法就结束今天面试,前面你使用 Go 的写实现两个 goroutine 交替执行打印数字和字母。那么我们换 Rust 版本,实现完成咱们今天就面试结束。

Rust 版本:交替执行打印数字和字母

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 使用 Arc 和 Mutex 来共享状态
    let counter = Arc::new(Mutex::new(1));

    let counter_clone = Arc::clone(&counter);

    // 创建一个线程打印数字
    let handle1 = thread::spawn(move || {
        print_numbers(counter_clone);
    });

    // 创建另一个线程打印字母
    let handle2 = thread::spawn(move || {
        print_letters(counter);
    });

    // 等待两个线程完成
    handle1.join().unwrap();
    handle2.join().unwrap();
}

fn print_numbers(counter: Arc<Mutex<i32>>) {
    for _ in 0..5 {
        let mut num = counter.lock().unwrap();
        println!("{}", *num);
        *num += 1;
    }
}

fn print_letters(counter: Arc<Mutex<i32>>) {
    for _ in 0..5 {
        let letter = char::from_u32('A' as u32 + counter.lock().unwrap().rem_euclid(26) as u32)
            .unwrap();
        println!("{}", letter);
    }
}

Github地址:https://github.com/metashops/GoFamily

我是渔夫,现在在国内某某云程序员,业余独立开发者,探索副业,生活、技术、非科班转码经验等相关文章,欢迎关注,和渔夫一起成长。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值