From 671347dfde424b315ed8f2c503b5ec4cbef4381e Mon Sep 17 00:00:00 2001 From: li_chx Date: Thu, 16 Apr 2026 15:44:15 +0800 Subject: [PATCH] =?UTF-8?q?2515.=20=E5=88=B0=E7=9B=AE=E6=A0=87=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E7=9A=84=E6=9C=80=E7=9F=AD=E8=B7=9D=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 54 +++++++++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5ecada7..2727f9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,47 +1,39 @@ +use crate::arr::make_string_arr; use std::collections::HashMap; mod arr; struct Solution {} impl Solution { - pub fn solve_queries(nums: Vec, queries: Vec) -> Vec { - let mut mp = HashMap::>::new(); - let n = nums.len() as i32; - let mut queries = queries; - for i in 0..nums.len() { - if mp.contains_key(&nums[i]) { - mp.get_mut(&nums[i]).unwrap().push(i); - } else { - mp.insert(nums[i], vec![i]); - } + pub fn closest_target(words: Vec, target: String, start_index: i32) -> i32 { + let n = words.len(); + let map = words.into_iter().enumerate().fold( + HashMap::>::new(), + |mut acc, (i, word)| { + acc.entry(word).or_default().push(i); + acc + }, + ); + if map.contains_key(&target) { + let arr = map.get(&target).unwrap(); + let idx = arr.partition_point(|&x| x < start_index as usize); + let a = arr[idx % arr.len()].abs_diff(start_index as usize); + let b = arr[(idx + arr.len() - 1) % arr.len()].abs_diff(start_index as usize); + a.min(n - a).min(b).min(n - b) as i32 + } else { + -1 } - for i in 0..queries.len() { - let arr = mp.get(&nums[queries[i] as usize]).unwrap(); - if arr.len() == 1 { - queries[i] = -1; - continue; - } - - let idx = arr.partition_point(|&x| x <= queries[i] as usize); - if arr.len() == 2 { - queries[i] = (arr[idx % arr.len()] as i32).abs_diff(queries[i]) as i32; - queries[i] = queries[i].min(n - queries[i]); - continue; - } - let mut a = arr[idx % arr.len()].abs_diff(queries[i] as usize) as i32; - let mut b = arr[(idx + arr.len() - 2) % arr.len()].abs_diff(queries[i] as usize) as i32; - a = a.min(n - a); - b = b.min(n - b); - queries[i] = a.min(b); - } - queries } } fn main() { println!( "{:?}", - Solution::solve_queries(vec![12, 19, 12, 8, 12, 10], vec![0, 5, 3, 1]) + Solution::closest_target( + make_string_arr(r#"["hello","i","am","leetcode","hello"]"#), + "hello".to_string(), + 1 + ) ); } /*