大家好,我是渔夫。
今天分享主题,最近有位伙伴面试 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
我是渔夫,现在在国内某某云程序员,业余独立开发者,探索副业,生活、技术、非科班转码经验等相关文章,欢迎关注,和渔夫一起成长。