登录

vivo 2020届校招在线编程笔试B卷第二题

PHP笔记
0 1034

今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:

将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;

最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。

输入描述:

输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:

输出描述:

输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:

输入例子1:

6 3

输出例子1:

3 6 4 2 5 1

例子说明1:

6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。

public function demo(){
    $number = $this->request->request('number'); // 人数
    $multiple = $this->request->request('multiple'); // 倍数
    $total_number_arr = array();
    for ($i = 1; $i <= $number; $i++) {
        $total_number_arr[$i] = $i;
    }
    $surplus_number = $total_number_arr;
    $listing_order_arr = array();
    $data = $this->getJobNumber($total_number_arr $surplus_number $multiple $listing_order_arr);
    $this->success('返回成功' $data);
}
/**
* $total_number_arr    总人数组
* $surplus_number      剩余人数数组
* $multiple            倍数
* $listing_order_arr   出队数组
*/
public function getJobNumber($total_number_arr $surplus_number $multiple $listing_order_arr){
    if(count($surplus_number) < $multiple){
        foreach ($surplus_number as $k => $v) { 
            if(is_int($k / $multiple)){
                array_push($listing_order_arr $v);
                unset($surplus_number[$k]);
            }
        }
        foreach ($surplus_number as $k => $v) {
            array_push($listing_order_arr $v);
        }
        return $listing_order_arr;
    }
    $original_total_number_arr = $total_number_arr; // 原始人数数组
    foreach ($surplus_number as $k => $v) {
        if(is_int($k / $multiple)){
        array_push($listing_order_arr $v);
    }else{
        array_push($total_number_arr $v);
        }
    }
    $surplus_number = array_diff_assoc($total_number_arr $original_total_number_arr); // 剩余人数数组
    return $this->getJobNumber($total_number_arr $surplus_number $multiple $listing_order_arr);
}

发表评论

0 个回复