|
@@ -0,0 +1,58 @@
|
|
|
+struct Solution;
|
|
|
+
|
|
|
+
|
|
|
+impl Solution {
|
|
|
+ pub fn gray_code(n: i32) -> Vec<i32> {
|
|
|
+ let count = i32::pow(2, n as u32) as usize;
|
|
|
+ let mut res = vec![0; count];
|
|
|
+ for i in 0..count {
|
|
|
+ let mut cur_num = 0;
|
|
|
+ for j in 0..n as usize {
|
|
|
+ let base = i32::pow(2, j as u32);
|
|
|
+ // 0,1
|
|
|
+ // 0,0,1,1
|
|
|
+ // 0,0,0,0,1,1,1,1
|
|
|
+ // 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
|
|
|
+ let mut digit = if ((i as i32) / base) % 2 == 0 {
|
|
|
+ 0
|
|
|
+ } else {
|
|
|
+ 1
|
|
|
+ };
|
|
|
+ digit = if ((i as i32) / (base * 2)) % 2 == 0 {
|
|
|
+ digit
|
|
|
+ } else {
|
|
|
+ 1 - digit
|
|
|
+ };
|
|
|
+ // println!("base: {}, digit: {}", base, digit);
|
|
|
+ cur_num += base * digit;
|
|
|
+ }
|
|
|
+ res[i] = cur_num;
|
|
|
+ }
|
|
|
+
|
|
|
+ res
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#[cfg(test)]
|
|
|
+mod tests {
|
|
|
+ use super::*;
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_gray_code() {
|
|
|
+ let n = 2;
|
|
|
+ let res = Solution::gray_code(n);
|
|
|
+ assert_eq!(res, vec![0,1,3,2]);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_gray_code2() {
|
|
|
+ let n = 3;
|
|
|
+ let res = Solution::gray_code(n);
|
|
|
+ assert_eq!(res, vec![0,1,3,2,6,7,5,4]);
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|