基于 Rust 实现了一个阿里云动态域名解析更新程序。
https://github.com/xpader/rust-aliddns
主要实现了阿里的 API 动态参数鉴权,公网 IP 与解析设置对比检测,解析添加和更新等等。
学 Rust 的拙劣之作,欢迎评头论足。
基于 Rust 实现了一个阿里云动态域名解析更新程序。
https://github.com/xpader/rust-aliddns
主要实现了阿里的 API 动态参数鉴权,公网 IP 与解析设置对比检测,解析添加和更新等等。
学 Rust 的拙劣之作,欢迎评头论足。
尝试着在 LeetCode 上用 Rust 刷些题。
题目地址:https://leetcode-cn.com/problems/add-binary/
这一题我的解法基本上就是把两个二进制反转后从前往后挨个进行相加进位,感觉代码还不够优雅。
但是基础原理够明白,没有任何所谓的溢出问题。
对于 Rust 不不是很熟悉,最折腾的就是这个 string_bin_vec 函数,最开始直接用 to_bytes() 或 .reverse() 进行反转,被借用、引用折腾好久就是编译不过,最终采用了复制成反转的 vec 方法,不过看了别人的题貌似两个字符串可以使用 .chars().rev() 之后以 iter 的形式进行遍历。
impl Solution { pub fn add_binary(a: String, b: String) -> String { // 从后向前运算会比较麻烦,所以这里将字符串复制成反转的 vec 后从前往后算就简单的多 let ab = Solution::string_bin_vec(&a); let bb = Solution::string_bin_vec(&b); let mut c: Vec<u8> = vec![]; // 当两个二进制字符串不一样长时,确定最长的处理次数 let al = ab.len(); let bl = bb.len(); let max_len = if al > bl { al } else { bl }; let mut plus = false; for x in 0..max_len { let ax: u8 = if x < al { ab[x] } else { 0 }; let bx: u8 = if x < bl { bb[x] } else { 0 }; // 确定当前相加值和是否有进位 let mut cur: u8 = if ax == bx { 0 } else { 1 }; let mut now_plus: bool = ax == 1 && bx == 1; // 如果前一次运算有进位则需要再运算 if plus { cur = if cur == 0 { 1 } else { now_plus = true; 0 } } println!("ax={}, bx={}, cur={}, plus={}", ax, bx, cur, plus); plus = now_plus; c.push(cur); } if plus { c.push(1); } // 结果要再反转一下成为正常的顺序 c.reverse(); // 还原成字符串并返回 let mut cs: String = String::from(""); for x in 0..c.len() { let s = if c[x] == 1 { "1" } else { "0" }; cs.push_str(s); } cs } fn string_bin_vec(str: &String) -> Vec<u8> { let bytes = &str.as_bytes(); let mut new_vec: Vec<u8> = vec![]; for x in 0..bytes.len() { new_vec.push(if bytes[x] == 48 { 0 } else { 1 }); } new_vec.reverse(); new_vec } }
最近学习 Rust 时对它的所有权,借用等概念,包括语法之类的都还算好理解,但碰到 Some、Option、Result 这些,包括语句后面的 ? 号等等着实困惑了一把,不过经过各种资料的翻阅,总算是理解这几样东西的用法及存在的意义,在这里记录一下。