阿里笔试第一题,母猪超生

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Main {

/** 请完成下面这个函数,实现题目要求的功能 **/
 /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String[] line = in.nextLine().split(",");
        int m = Integer.valueOf(line[0]);
        int k = Integer.valueOf(line[1]);;
        System.out.println(calculate(m, k));

    }
    static int reverse(int k){
        String out = "";
        char[] ch = String.valueOf(k).toCharArray();
        for(int i=ch.length-1;i>-1;i--){
            out+=(ch[i]+"");
        }
        return Integer.parseInt(out);
    }
    static String calculate(int m,int k){
        String out = "";
        if(m==1){
            out="2,2019,1";//有可能k>m
        }
        else if(m==2){
            out="2,2019"+String.valueOf(k);
        } 
        else if(m==3){
            out="4,2020,"+String.valueOf(k);
        }
        else{
        int num1 = 2;
        int num2 = 3;
        int year = 2020;
        int up = 1;
            ArrayList<Integer> al = new ArrayList<Integer>();
            al.add(2);
            al.add(3);
            al.add(4);
            int pig = 3;
            int next = 0;
            int alind = 0;
            while(pig<m){
                next = num1+num2;
                pig+=next;
                num1 = num2;
                num2 = next;
                year+=up;
                if(pig>=m){
                    break;
                }
                else{
                   while(next>0){
                      al.add(al.get(alind)+al.get(alind+1));
                      alind++;
  
                      next--;
                   }
                }
            }
            if(next>0){year+=up;
            while(next-(pig-m)>0){
                      al.add(al.get(alind)+al.get(alind+1));
                      alind++;
                      next--;
            }}
            out = String.valueOf(al.get(alind+2))+","+String.valueOf(year)+",";
            ArrayList<Integer> reversenum = new ArrayList<Integer>();
            for(int i=0;i<al.size();i++){
                  reversenum.add(reverse(al.get(i)));
            }
            Collections.sort(reversenum);
            int pigk = reverse(reversenum.get(reversenum.size()-k));
            int i ;
            for(i=0;i<al.size();i++){
                if(pigk == al.get(i)){break;} 
            }
       
            out+=String.valueOf(i+1);
        }
        return out;
    }
}
#阿里巴巴##笔试题目##春招#
全部评论
测试例子可以 其他年数好像少了一年
点赞 回复 分享
发布于 2019-04-13 11:40
有没有大佬能给我解释一下 前20头编号应该是 [2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, 465] 那么逆序后第3大的不应该是114吗15是哪来的(这里根本就没有51这个编号啊?)
点赞 回复 分享
发布于 2019-04-12 23:38
public class Main1 {     static class Pig {         public int id;         public int number;         public int age;         public Pig(int id, int number, int age) {             this.id = id;             this.number = number;             this.age = age;         }         @Override         public String toString() {             return String.valueOf(age);         }     }     private static String calculate(int m, int k) {         PriorityQueue<Pig> minHeap = new PriorityQueue<>(                 Comparator.comparingInt(o ->                         Integer.valueOf(new StringBuilder(String.valueOf(o.number)).reverse().toString())));         LinkedList<Pig> list = new LinkedList<>();         list.add(new Pig(1, 2, 1));         list.add(new Pig(2, 3, 3));         LinkedList<Integer> number = new LinkedList<>();         number.add(2);         number.add(3);         for (Pig pig : list) {             minHeap.offer(pig);             if (minHeap.size() > k) {                 minHeap.poll();             }         }         int year = 2020;         int id = 2;         while (id < m) {             LinkedList<Pig> buffer = new LinkedList<>();             for (Pig pig : list) {                 if (pig.age < 2) {                     pig.age++;                 } else {                     id++;                     int thisNumber;                     if (number.size() < 3) {                         thisNumber = 4;                         number.add(thisNumber);                     } else {                         thisNumber = number.get(0) + number.get(1);                         number.add(thisNumber);                         number.remove(0);                     }                     Pig newPig = new Pig(id, thisNumber, 1);                     buffer.add(newPig);                     minHeap.offer(newPig);                     if (minHeap.size() > k) {                         minHeap.poll();                     }                     if (id == m) {                         break;                     }                 }             }             list.addAll(buffer);             buffer.clear();             System.out.println("Year: " + year + "\t" + list);             if (id >= m) {                 break;             }             year++;         }         return number.get(number.size() - 1) + "," + year + "," + minHeap.poll().id;     }     public static void main(String[] args) {         String tmp = calculate(20, 3);         System.out.println(tmp);     } 这是我刚调的,还请大佬指正!当时的测试用例是过了的。阿里我佛系了,这笔试血炸……
点赞 回复 分享
发布于 2019-04-12 21:43
import java.util.*; public class Main { /** 请完成下面这个函数,实现题目要求的功能 **/ /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/ static String calculate(int m, int k) { int[]number=new int[m];//存放序号 number[0]=2; number[1]=3; number[2]=4; String result=""; for(int i=3;i<m;i++){ number[i]=number[i-2]+number[i-3]; } result=number[m-1]+""; int[] number2=new int[m];//存放数量 number2[0]=2; number2[1]=3; for(int i=2;i<m;i++){ number2[i]=number2[i-1]+number2[i-2]; } for(int i=2;i<m;i++){ if(number2[i]>=m){ result=result+","+(2019+i); break; } } int[] temp=new int[m]; for(int i=0;i<m;i++){ temp[i]=number[i]; } for(int i=0;i<m;i++){ StringBuilder s=new StringBuilder(temp[i]+""); s.reverse(); temp[i]=Integer.parseInt(s.toString()); } Arrays.sort(temp); StringBuilder s1=new StringBuilder(temp[m-k]+""); s1.reverse(); String target=s1.toString(); for(int i=0;i<m;i++) { if(number[i]==Integer.parseInt(target)){ result=result+","+(i+1); break; } } return result; } public static void main(String[] args){ Scanner in = new Scanner(System.in); String[] line = in.nextLine().split(","); int m = Integer.valueOf(line[0]); int k = Integer.valueOf(line[1]);; System.out.println(calculate(m, k)); } }
点赞 回复 分享
发布于 2019-04-12 21:32
k是返回编号 k是第k大 第k大的编号楼主直接输出k是不对的感觉..
点赞 回复 分享
发布于 2019-04-12 21:13
我跟楼主后面的计算结果一样,就是没注意特殊的结果
点赞 回复 分享
发布于 2019-04-12 21:07
楼主你能找到提交的按钮吗,我完全按都没有按..提交呜呜
点赞 回复 分享
发布于 2019-04-12 20:59
楼主过了多少,AC了?
点赞 回复 分享
发布于 2019-04-12 20:52
跟楼主做法一模一样,只是list一开始的值漏了一个
点赞 回复 分享
发布于 2019-04-12 20:51

相关推荐

喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
17
分享

创作者周榜

更多
牛客网
牛客企业服务