1pub fn is_sorted<T: PartialOrd>(v: &[T]) -> bool {
17 if v.is_empty() {
18 return true;
19 }
20
21 for i in 0..v.len() - 1 {
22 if v[i] > v[i + 1] {
23 return false;
24 }
25 }
26 true
27}
28
29pub fn sorted_ref<T: Ord>(v: &[T]) -> Vec<&T> {
43 let mut copy = v.iter().collect::<Vec<_>>();
44 copy.sort();
45 copy
46}
47
48pub fn sorted_copy<T: Ord + Clone>(v: &[T]) -> Vec<T> {
68 let mut copy: Vec<T> = v.iter().map(|x| (*x).clone()).collect();
69 copy.sort();
70 copy
71}
72
73pub fn is_palindrome<T: PartialEq>(v: &[T]) -> bool {
89 if v.len() < 2 {
90 return true;
91 }
92 let mut i = 0;
94 let mut j = v.len() - 1;
95 while i < j {
96 if v[i] != v[j] {
97 return false;
98 }
99 i += 1;
100 j -= 1;
101 }
102 true
103}
104
105#[cfg(test)]
108mod tests {
109 use super::*;
110
111 #[test]
112 fn is_sorted_test1() {
113 assert!(is_sorted(&Vec::<i32>::new()));
114 assert!(is_sorted(&vec![1]));
115 assert!(is_sorted(&vec![1, 1]));
116 assert!(is_sorted(&vec![1, 2, 3]));
117 assert!(is_sorted(&vec![1, 2, 3, 3]));
118 assert!(is_sorted(&vec![1, 2, 3, 4, 5]));
119 assert!(is_sorted(&vec![1, 2, 3, 4, 5, 5, 5, 5]));
120 }
121
122 #[test]
123 fn is_sorted_test2() {
124 assert_eq!(is_sorted(&vec![2, 1]), false);
125 assert_eq!(is_sorted(&vec![1, 2, 3, 4, 3]), false);
126 assert_eq!(is_sorted(&vec![1, 2, 3, 2, 5]), false);
127 assert_eq!(is_sorted(&vec![1, 2, 1, 4, 5]), false);
128 assert_eq!(is_sorted(&vec![1, 0, 3, 4, 5]), false);
129 assert_eq!(is_sorted(&vec![3, 2, 3, 4, 5]), false);
130 }
131
132 #[test]
133 fn is_sorted_test3() {
134 assert!(is_sorted(&Vec::<&str>::new()));
135 assert!(is_sorted(&vec!["aa"]));
136 assert!(is_sorted(&vec!["aa", "aa"]));
137 assert!(is_sorted(&vec!["aa", "bb", "cc"]));
138 assert_eq!(is_sorted(&vec!["aa", "cc", "bb"]), false);
140 assert_eq!(is_sorted(&vec!["aa", "bb", "cc", "bb"]), false);
141 }
142
143 #[test]
144 fn sorted_ref_test1() {
145 let array = [8, 2, 9, 3];
146 assert_eq!(sorted_ref(&array), vec![&2, &3, &8, &9]);
147
148 let v = Vec::<i32>::new();
149 assert_eq!(sorted_ref(&v), Vec::<&i32>::new());
150
151 let v = ["bb", "cc", "aa"];
152 assert_eq!(sorted_ref(&v), vec![&"aa", &"bb", &"cc"]);
153 }
154
155 #[test]
156 fn sorted_copy_test1() {
157 let mut v = vec![6, 1, 9, 2, 0];
158 let sorted = sorted_copy(&v);
159 v[0] = 99;
160 assert_eq!(v, vec![99, 1, 9, 2, 0]);
161 assert_eq!(sorted, vec![0, 1, 2, 6, 9]);
162
163 let array = [8, 2, 9, 3];
164 assert_eq!(sorted_copy(&array), vec![2, 3, 8, 9]);
165
166 let v = ["bb", "cc", "aa"];
167 assert_eq!(sorted_copy(&v), vec!["aa", "bb", "cc"]);
168 }
169
170 #[test]
171 fn is_palindrome_test() {
172 assert_eq!(is_palindrome(&Vec::<i32>::new()), true);
173 assert_eq!(is_palindrome(&[0]), true);
174 assert_eq!(is_palindrome(&[0, 1]), false);
175 assert_eq!(is_palindrome(&[1, 1]), true);
176 assert_eq!(is_palindrome(&[1, 0, 1]), true);
177 assert_eq!(is_palindrome(&[1, 9, 7, 7]), false);
179 assert_eq!(is_palindrome(&[2, 0, 2, 2]), false);
180 assert_eq!(is_palindrome(&vec![1, 9, 9, 1]), true);
181 }
182}