让人抓狂的 Rust

本贴最后更新于 1848 天前,其中的信息可能已经斗转星移

刚看 Rust 没几天,想着去 leetcode 上练练,找到这么一个题

80. 删除排序数组中的重复项 II

答案很简单,Java 代码答案如下

 

class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int n : nums) if (i < 2 || n > nums[i-2]) nums[i++] = n; return i; } }

很简单吧,也看了几天 Rust 语法了,直接上

fn remove_duplicates(nums: μ Vec<i32>) -> i32 { let mut i = 0; for x in nums { if i < 2 || x > nums[i-2] { nums[i] = x; } i++; } return i; }

这也太简单了,然而。。。

$ cargo run 101 ↵ Compiling demo v0.1.0 (/Users/tiangaoshi/rust/demo) error: expected expression, found `+` --> src/main.rs:14:11 | 14 | i++; | ^ expected expression error[E0308]: mismatched types --> src/main.rs:11:25 | 11 | if i < 2 || x > nums[i-2] { | ^^^^^^^^^ | | | expected `μ i32`, found `i32` | help: consider mutably borrowing here: `μ nums[i-2]` error[E0308]: mismatched types --> src/main.rs:12:23 | 12 | nums[i] = x; | ^ | | | expected `i32`, found `μ i32` | help: consider dereferencing the borrow: `*x` error[E0308]: mismatched types --> src/main.rs:16:12 | 8 | fn remove_duplicates(nums: μ Vec<i32>) -> i32 { | --- expected `i32` because of return type ... 16 | return i; | ^ expected `i32`, found `usize` | help: you can convert an `usize` to `i32` and panic if the converted value wouldn't fit | 16 | return i.try_into().unwrap(); | ^^^^^^^^^^^^^^^^^^^^^

WTF??? 这么多错误, let mut 不是变量吗,nums 不是数组吗,为啥?

没办法,碰到问题解决问题,

第一个最简单,不支持 ++, 那就 i += 1;

第二个没看懂啥意思,大概是不可变,加一行 let a = i - 2;

第三个有提示了 nums[i] = *x;

最后一个应该是类型错误

fn remove_duplicates(nums: μ Vec<i32>) -> i32 { let mut i = 0; for x in nums { let a = i - 2; if i < 2 || *x > nums[a] { nums[i] = *x; } i += 1; } return i as i32; }

gogogo~~~~

╰─$ cargo run 101 ↵ Compiling demo v0.1.0 (/Users/tiangaoshi/rust/demo) error[E0382]: borrow of moved value: `nums` --> src/main.rs:12:26 | 8 | fn remove_duplicates(nums: μ Vec<i32>) -> i32 { | ---- move occurs because `nums` has type `μ std::vec::Vec<i32>`, which does not implement the `Copy` trait 9 | let mut i = 0; 10 | for x in nums { | ---- | | | value moved here | help: consider borrowing to avoid moving into the for loop: `#` 11 | let a = i - 2; 12 | if i < 2 || *x > nums[a] { | ^^^^ value borrowed here after move error: aborting due to previous error

我真是黑人问号脸了,什么鬼啊


此处省去几天时间的各种尝试和查阅文档,

甚至仔仔细细读了 <<Rust 编程之道 >> 前面几章,

中间还找到了一个仓库 https://github.com/aylei/leetcode-rust ,直接去翻 80

https://github.com/aylei/leetcode-rust/blob/master/src/solution/s0080_remove_duplicates_from_sorted_array_ii.rs

oh shit~
 

今天综合几天的经验,终于尝试搞出了一个能过的版本

fn remove_duplicates(nums: μ Vec<i32>) -> i32 { let mut i = 0; let list = nums.clone(); for x in list { if i < 2 { let a = i; nums[a] = x; i += 1; } else { let a = i; let b = i - 2; if x > nums[b] { nums[a] = x; i += 1; } } } return i as i32; }

我真的是醉了,这是个什么鬼语言,好歹我也是写过 C 玩过汇编单片机,C++ 入过门,N 年 Java, 一年 Golang 滚过, Kotlin 爽过,中间还掺杂 Elixir Swift 认知的职业搬砖工,这写第一个算法题就玩我这么久,坑啊

只能说自己菜了,果然老人言说得对,一上来就写代码肯定会栽跟头的

Rust 肯定是值得学习的,看看人家 actix,简直是一骑绝尘

学无止境,目测最最后一版也只是能过而已,肯定有更精炼的写法,手动捂脸,🤦🤦🤦

最后附上一个此题的提交记录,同一套算法

图片.png

第二天

感觉好像又理解了些东西,又写了一版,好看多了,舒服

impl Solution { fn remove_duplicates(nums: μ Vec<i32>) -> i32 { let mut ans = 2; let size = nums.len(); for i in 2..size { let a = ans - 2; if nums[a] < nums[i] { nums[ans] = nums[i]; ans += 1; } } return ans as i32; } }

觉得学语言其实是在学模式,解决一个问题有千万种方法,不通的方法对应的也是不通的效率,开发效率跟运行效率就像鱼跟熊掌,enmmm,小孩子才做选择,我都要

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 5 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
2 操作
tiangao 在 2020-04-21 10:59:32 更新了该帖
tiangao 在 2020-04-21 10:55:14 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • hefeng

    Rust 性能这么好的么?

    1 回复
  • tiangao via macOS

    毕竟目标是 C++

  • itfanr

    如果 rust 代码能编译通过,基本没有崩溃的可能。

推荐标签 标签

  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 1 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1441 引用 • 10069 回帖 • 494 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 177 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9746 引用 • 44340 回帖 • 86 关注
  • OneNote
    1 引用 • 3 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 160 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 4 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Follow
    4 引用 • 12 回帖 • 12 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 29 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 107 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 16 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 110 关注