carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode1122:数组的相对排序(relative-sort-array) #189

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。

对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

 

示例 1:

输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19]

示例  2:

输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6] 输出:[22,28,8,6,17,44]  

提示:

1 <= arr1.length, arr2.length <= 1000 0 <= arr1[i], arr2[i] <= 1000 arr2 中的元素 arr2[i]  各不相同  arr2 中的每个元素 arr2[i] 都出现在 arr1 中

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/relative-sort-array

carloscn commented 1 year ago

问题分析

既然是排序,我们就按照冒泡排序的模板进行,循环和排序,接着判断排序的规则需要重新开发,is_swap(a, b, rule) 来判断。

fn is_swap(a:i32, b:i32, rule:&Vec<i32>) -> bool
{
    if rule.len() < 1 || a == b {
        return false;
    }
    let a_pos = rule.iter().position(|&x| x == a);
    let b_pos = rule.iter().position(|&x| x == b);

    if a_pos == None && b_pos != None {
        return true;
    } else if a_pos != None && b_pos == None {
        return false;
    } else if a_pos != None && b_pos != None {
        return a_pos > b_pos;
    }

    return a > b;
}

pub fn relative_sort_array(arr1: Vec<i32>, arr2: Vec<i32>) -> Vec<i32>
{
    let mut ret_vec:Vec<i32> = vec![];

    if arr1.len() < 1 ||
       arr2.len() < 2 ||
       arr1.len() < arr2.len() {
        return ret_vec;
    }

    if arr1.len() == 1 {
        ret_vec.push(arr1[0]);
        return ret_vec;
    }

    ret_vec.append(&mut arr1.clone());
    for i in 0..(arr1.len() - 1) {
        for j in 0..(arr1.len() - 1 - i) {
            if is_swap(ret_vec[j], ret_vec[j + 1], &arr2) {
                let temp = ret_vec[j + 1];
                ret_vec[j + 1] = ret_vec[j];
                ret_vec[j] = temp;
            }
        }
    }

    return ret_vec;
}
carloscn commented 1 year ago

code

https://review.gerrithub.io/c/carloscn/structstudy/+/552736 https://github.com/carloscn/structstudy/commit/bded146bbe92854efe30293b7de1f8abf5d0f954