vivo2020校招笔试题[编程题]报数(约瑟夫问题又称丢手绢问题)-java解决

今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。


import java.io.*;
import java.util.*;

/**
 *
 时间限制:1秒    空间限制:32768K
 今年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的最后一个出列。
 */
//运行时间: 140 ms 占用内存:14236K 使用SpringBuilder存储输出值
//运行时间: 170 ms 占用内存:15100K 使用Springbuffer存储输出值
//运行时间: 184 ms 占用内存:15180K 使用arraylist存储输出值(多一步转为string之后删除中括号与逗号的步骤)
public class StudentId {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();
        int input[] = parseInts(inputStr.split(" "));
        String output = solution(input);
        System.out.println(output);
    }

    private static int[] parseInts(String[] strArr) {
        if (strArr == null || strArr.length == 0) {
            return new int[0];
        }
        int[] intArr = new int[strArr.length];
        for (int i = 0; i < intArr.length; i++) {
            intArr[i] = Integer.parseInt(strArr[i]);
        }
        return intArr;
    }

    private static String solution(int[] input) {
        // TODO Write your code here
        int count = 0;//存储上一个分配到学号的位置
        int input1 = input[1];//
        int input0 = input[0];//
        List<Integer> list = new ArrayList<>();
        StringBuilder result = new StringBuilder();
        //List<Integer> keyList = new ArrayList<>();
        for(int e=1;e<=input0;e++){
           list.add(e);
        }
        for(int i=1;list.size()>0;i++){
            if(i%input1==0){
                result.append(list.remove(count)+" ");
            }else {
                count++;
            }
            if(count>=list.size()){
                count-=list.size();
            }
        }
        //String result = keyList.toString();
        /*result=result.replaceAll("\\[","").replaceAll("\\[","");
        result=result.replaceAll("]","").replaceAll("]","");
        result=result.replaceAll(",","").replaceAll(",","");*/
        return result.toString();
    }
}

第一次写的没用list存储列表remove的方法,要多加一个判断是否存在的循环,结果用时过长。使用String类型存储输出结果,耗时长达七百多毫秒。
此题为约瑟夫问题又称丢手绢问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值