我的测试在 "attempt to subtract with overflow" 失败

My test fails at "attempt to subtract with overflow"

use itertools::Itertools;

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
struct Runner {
    sec: u16,
}

impl Runner {
    fn from(v: (u8, u8, u8)) -> Runner {
        Runner {
            sec: v.0 as u16 * 3600 + v.1 as u16 * 60 + v.2 as u16
        }
    }
}


fn parse_runner(strg: &str) -> Vec<Runner> {
    strg.split(", ")
        .flat_map(|personal_result| personal_result.split('|'))
        .map(|x| x.parse::<u8>().unwrap())
        .tuples::<(_, _, _)>()
        .map(|x| Runner::from(x))
        .sorted()
        .collect::<Vec<Runner>>()
}

fn parse_to_format(x: u16) -> String {
    let h = x / 3600;
    let m = (x - 3600)/60;
    let s = x % 60;

    format!("{:02}|{:02}|{:02}", h, m, s)
}

fn return_stats(runners: &[Runner]) -> String {
    let range: u16 = runners.last().unwrap().sec - runners.first().unwrap().sec;
    let average: u16 = runners.iter().map(|&r| r.sec).sum::<u16>()/(runners.len() as u16);
    let median: u16 = if runners.len()%2 != 0 {
        runners.get(runners.len()/2).unwrap().sec
    } else {
        runners.get(runners.len()/2).unwrap().sec/2 + runners.get((runners.len()/2) + 1).unwrap().sec/2
    };
    format!("Range: {} Average: {} Median: {}", parse_to_format(range), parse_to_format(average), parse_to_format(median))

}

fn stati(strg: &str) -> String {
    let run_vec = parse_runner(strg);
    return_stats(&run_vec)
}

我找不到我用减法使我的代码通过测试所犯的错误。基本上,我试图从 &str 开始,例如 "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17" 并以另一个类似 "范围:00|47|18 平均值:01|35|15 中值:01|32|34“

如果我的错误真的很愚蠢,请提前道歉,我已经尝试修复了很长一段时间

https://www.codewars.com/kata/55b3425df71c1201a800009c/train/rust

let m = (x - 3600) / 60;

正如彼得所说,如果 x 小于 3600,那确实会溢出。A u16 不能为负数。

使用整数运算,这是另一种将秒格式化为 hh|mm|ss 且不会溢出的方法:

fn seconds_to_hhmmss(mut s: u64) -> String {
    let h = s / 3600;
    s -= h * 3600;
    let m = s / 60;
    s -= m * 60;
    
    format!("{:02}|{:02}|{:02}", h, m, s)
}