字节跳动笔试-分配房间
编程题2
http://www.nowcoder.com/questionTerminal/43068a1013b4417a85c2c2ce8b18159e
题目
有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。
现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。
输入描述:
第一行两个整数n, x (2<=n<=10^5, 1<=x<=n),代表房间房间数量以及最后一个人被分配的房间号; 第二行n个整数 a_i(0<=a_i<=10^9) ,代表每个房间分配后的人数。
输出描述:
输出n个整数,代表每个房间分配前的人数。
示例1
输入
3 1 6 5 1
输出
4 4 4
详细见注释
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt() - 1;
int[] nums = new int[n];
long[] res = new long[n];
int min = 0;
//得到最小的值的下标
for(int i = 0;i < n;++i){
nums[i] = sc.nextInt();
min = nums[min] >= nums[i] ? i : min;
}
int k = nums[min];
//若x前面有最小值,更新min为最接近x的索引
//若x前面没有最小值,min为最靠后的最小值
for(int i = 0;i <= x;++i){
if(nums[i] == k) {
min = i;
}
}
//计算最后一次分配房间初始人数
//取出最后一次分配后的人数,由于每次从min位置向后一个一个房间加人
//【6,5,1】 min = 2 x = 0
//【1,1,1】
//【1,0,0】
//【6,5,1】 min = 2 x = 1
//【1,1,1】
//【1,1,0】
//故最后一次 总共分配了 k * n + (x - min + n) % n个人
long count = (long) k * n + (x - min + n) % n;
for(int i = 0;i < n;++i){
if(i == min){
res[i] = count;
}else if((x > min && i > min && i <= x) || x < min && !(i > x && i < min)){
//x > min
//【7,6,9,5,1,8,9,2】 x = 6 min = 4
//【0,0,0,0,0,1,1,1】
//【1,1,1,1,1,1,1,0】
//此时 当 i > min && i < x 时 被分配了 k + 1个人,其余均为k个人
////x > min
//【7,6,9,5,1,8,9,2】 x = 2 min = 4
//【0,0,0,0,0,1,1,1】
//【1,1,1,1,1,1,1,1】
//【1,1,1,0,0,0,0,0】
//此时 当 i > min && i < x 时 被分配了 k 个人,其余均为k + 1个人
res[i] = (long)(nums[i] - (k + 1));
}else{
res[i] = (long)(nums[i] - k);
}
}
for(int i = 0;i < n;++i){
if(i == 0)
System.out.print(res[i]);
else
System.out.print(" " + res[i]);
}
}
}
