pub fn is_sorted<T: PartialOrd>(v: &[T]) -> bool {
if v.is_empty() {
return true;
}
for i in 0..v.len() - 1 {
if v[i] > v[i + 1] {
return false;
}
}
true
}
pub fn sorted_ref<T: Ord>(v: &[T]) -> Vec<&T> {
let mut copy = v.iter().collect::<Vec<_>>();
copy.sort();
copy
}
pub fn sorted_copy<T: Ord + Clone>(v: &[T]) -> Vec<T> {
let mut copy: Vec<T> = v.iter().map(|x| (*x).clone()).collect();
copy.sort();
copy
}
pub fn is_palindrome<T: PartialEq>(v: &[T]) -> bool {
if v.len() < 2 {
return true;
}
let mut i = 0;
let mut j = v.len() - 1;
while i < j {
if v[i] != v[j] {
return false;
}
i += 1;
j -= 1;
}
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_sorted_test1() {
assert!(is_sorted(&Vec::<i32>::new()));
assert!(is_sorted(&vec![1]));
assert!(is_sorted(&vec![1, 1]));
assert!(is_sorted(&vec![1, 2, 3]));
assert!(is_sorted(&vec![1, 2, 3, 3]));
assert!(is_sorted(&vec![1, 2, 3, 4, 5]));
assert!(is_sorted(&vec![1, 2, 3, 4, 5, 5, 5, 5]));
}
#[test]
fn is_sorted_test2() {
assert_eq!(is_sorted(&vec![2, 1]), false);
assert_eq!(is_sorted(&vec![1, 2, 3, 4, 3]), false);
assert_eq!(is_sorted(&vec![1, 2, 3, 2, 5]), false);
assert_eq!(is_sorted(&vec![1, 2, 1, 4, 5]), false);
assert_eq!(is_sorted(&vec![1, 0, 3, 4, 5]), false);
assert_eq!(is_sorted(&vec![3, 2, 3, 4, 5]), false);
}
#[test]
fn is_sorted_test3() {
assert!(is_sorted(&Vec::<&str>::new()));
assert!(is_sorted(&vec!["aa"]));
assert!(is_sorted(&vec!["aa", "aa"]));
assert!(is_sorted(&vec!["aa", "bb", "cc"]));
assert_eq!(is_sorted(&vec!["aa", "cc", "bb"]), false);
assert_eq!(is_sorted(&vec!["aa", "bb", "cc", "bb"]), false);
}
#[test]
fn sorted_ref_test1() {
let array = [8, 2, 9, 3];
assert_eq!(sorted_ref(&array), vec![&2, &3, &8, &9]);
let v = Vec::<i32>::new();
assert_eq!(sorted_ref(&v), Vec::<&i32>::new());
let v = ["bb", "cc", "aa"];
assert_eq!(sorted_ref(&v), vec![&"aa", &"bb", &"cc"]);
}
#[test]
fn sorted_copy_test1() {
let mut v = vec![6, 1, 9, 2, 0];
let sorted = sorted_copy(&v);
v[0] = 99;
assert_eq!(v, vec![99, 1, 9, 2, 0]);
assert_eq!(sorted, vec![0, 1, 2, 6, 9]);
let array = [8, 2, 9, 3];
assert_eq!(sorted_copy(&array), vec![2, 3, 8, 9]);
let v = ["bb", "cc", "aa"];
assert_eq!(sorted_copy(&v), vec!["aa", "bb", "cc"]);
}
#[test]
fn is_palindrome_test() {
assert_eq!(is_palindrome(&Vec::<i32>::new()), true);
assert_eq!(is_palindrome(&[0]), true);
assert_eq!(is_palindrome(&[0, 1]), false);
assert_eq!(is_palindrome(&[1, 1]), true);
assert_eq!(is_palindrome(&[1, 0, 1]), true);
assert_eq!(is_palindrome(&[1, 9, 7, 7]), false);
assert_eq!(is_palindrome(&[2, 0, 2, 2]), false);
assert_eq!(is_palindrome(&vec![1, 9, 9, 1]), true);
}
}