Rust: codewars的Bleatrix Trotter

30 篇文章 0 订阅

题目很简单,主要是数羊。但数法是这样,比如,任给一个数,接下去是这个数的1,2,3….的倍数,顺序往下数。

什么时结束呢?这里有一个规则:

即每数一个数,把其中0-9中的数字记下来,不断收集起来,当收集到0-9中的全套10个数字时,任务结束。

比如, N = 1692.

N = 1692. 有数字: 1, 2, 6, and 9.
2N = 3384. 有数字,3,3,8,4; 共收集了 1, 2, 3, 4, 6, 8, 和 9.
3N = 5076. 有数字,5,0,7,6。共收集了全套的10个数字,任务结束,并记住5076。

此时5076就是我们要找的值。

要求,写一个函数,任给一个数字,返回收集全套的数字时的值。

一、解法

fn trotter(n: i32) -> i32 {

    let mut nums = "".to_string();
    let chs: Vec<char> = "0123456789".chars().into_iter().map(|x| x).collect();
    let mut lastnum: i32 = 0_i32;
    (1..).any(|x| {
        let val = x * n;
        let temp = &(val.to_string())
            .chars()
            .into_iter()
            .filter(|&y| !&nums.contains(y))
            .collect::<Vec<char>>();
        if temp.len()==0{return false}
        nums.extend(temp);
        match (&chs).into_iter().all(|&w| nums.contains(w)) {
            true => {
                lastnum = val;
                true
            },
            _ => false,
        }
    });
    lastnum
}

题目感觉不复杂,上面代码通过了测试,但是提交超时,仍需优化。

简化了一下,仍然不行:

fn trotter(n: i32) -> i32 {
    let mut nums = "".to_string();
    let chs: Vec<char> = "0123456789".chars().into_iter().map(|x| x).collect();
    let mut lastnum = 0_i32;
    (1..).any(|x| {
        nums.push_str(&((x * n).to_string()));
        match (&chs).into_iter().all(|&w| nums.contains(w)) {
            true => {
                lastnum = x * n;
                true
            }
            _ => false,
        }
    });
    lastnum
}

换一个类型?char->i32试试,仍然超时,也不行。

fn trotter(n: i32) -> i32 {
    //println!("trotter=> n:{:?}", n);
    let mut nums = vec![];
    let chs: Vec<i32> = "0123456789".chars().into_iter().map(|x| x as i32).collect();
    let mut lastnum: i32 = 0_i32;
    (1..).any(|x| {
        let val = x * n;
        let temp = &(val.to_string())
            .chars()
            .into_iter()
            .filter(|&y| !&nums.contains(&(y as i32)))
            .map(|w| w as i32)
            .collect::<Vec<i32>>();
        if temp.len() == 0 {
            return false;
        }
        nums.extend(temp);
        //println!("nums:{:?} temp:{:?} var:{:?},x:{}", nums, temp, val, x);
        match (&chs).into_iter().all(|&w| nums.contains(&w)) {
            true => {
                lastnum = val;
                //println!("nums:{:?}", nums);
                true
            }
            _ => false,
        }
    });
    //println!("=>nums :{:?} ", nums);
    lastnum
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值