题解 | #在字符串中找出连续最长的数字串#

在字符串中找出连续最长的数字串

http://www.nowcoder.com/practice/2c81f88ecd5a4cc395b5308a99afbbec

解题思路:
将字符串转换为u8数组v,再将数字串给转存到另一个数组m中,排序后输出。

use std::io::{self, *};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        let ll = line.unwrap();
        let v = ll.as_bytes();
        let mut m = vec![];
        let mut i = 0usize;
        while i < v.len() {
            if v[i] >= 48u8 && v[i] <= 57u8 {
                let mut j = i;
                let mut s = String::new();
                while j < v.len() && v[j] >= 48u8 && v[j] <= 57u8 {
                    s.push(char::from(v[j]));
                    j += 1;
                }
                m.push(s);
                i = j;
            }
            i += 1;
        }
        m.sort_by(|a, b| (b.len()).cmp(&(a.len())));
        let max_len = m[0].len();
        for i in m.iter() {
            if i.len() == max_len {
                print!("{}", i);
            } else {
                break;
            }
        }
        print!(",{}\n", max_len);
    }
}

改进一下:
如果要改进m的所占空间和免排序,可以在遍历时判断最大长度max_len,然后以此来判断清栈还是入栈操作,由于题目所给的字符串长度不大,所以实际效果差别不大。

use std::io::{self, *};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        let ll = line.unwrap();
        let v = ll.as_bytes();
        let mut m = vec![];
        let mut max_len = 0usize;
        let mut i = 0usize;
        while i < v.len() {
            if v[i] >= 48u8 && v[i] <= 57u8 {
                let mut j = i;
                let mut s = String::new();
                while j < v.len() && v[j] >= 48u8 && v[j] <= 57u8 {
                    s.push(char::from(v[j]));
                    j += 1;
                }
                if !m.is_empty() {
                    if max_len < s.len() {
                        max_len = s.len();
                        m.clear();
                        m.push(s);
                    } else if max_len == s.len() {
                        m.push(s);
                    }
                } else {
                    max_len = s.len();
                    m.push(s);
                }
                i = j;
            }
            i += 1;
        }
        for i in m.iter() {
            print!("{}", i);
        }
        print!(",{}\n", max_len);
    }
}
用 Rust 刷华为机试HJ 文章被收录于专栏

用 Rust 刷 HJ100 题,只需要懂基础 Rust 语法就能看懂

全部评论

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务