vivo 2020届校招在线编程笔试B卷第二题
PHP笔记
0
1179
今年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);}
发表评论