题解 | #在字符串中找出连续最长的数字串#
在字符串中找出连续最长的数字串
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 语法就能看懂