【笔试】2020年3月20号阿里笔试

输入10个int表示10种牌个数,可以打单牌(1),对子(11),顺子(12345), 连对(112233),求最少几次可以打完所有牌

(笔试时只通过了10%,现在重新编写将输出出牌次数改成输出出牌情况,方便大家理解以及帮助我纠错,注意:只经过我自己的测试,不一定能ac

public static void main(String[] args) {

    //10种牌,输入每种牌的张数
    Scanner sc = new Scanner(System.in);
    int n = 10;
    //测试
//        int[] arr = new int[]{1,2,2,2,1,1,1,2,1,2};
//        int[] arr = new int[]{1,1,1,2,2,2,2,2,1,1};
    int[] arr = new int[n];
    for(int i = 0; i < n; i++)
        arr[i] = sc.nextInt();

    //打印最快出牌情况
    List> res = dfs(arr,0);
    for(List lst : res)
        System.out.println(lst);

    //打印最快出牌次数
    System.out.println(res.size());

}

public static List> dfs(int[] arr, int index){
    if(index>=arr.length) return new ArrayList<>();
    if(arr[index]==0) return dfs(arr,index+1);

    //打双牌
    List> res = getMincount(arr,index,1,2);  //从index开始num种牌,每种牌至少有count张

    //打单牌
    List> res1 = getMincount(arr,index,1,1);
    if(res.isEmpty()||(res1.size()!=0&&res.size()>res1.size())) res=new ArrayList<>(res1);

    //打顺子
    res1 = getMincount(arr,index,5,1);
    if(res.isEmpty()||(res1.size()!=0&&res.size()>res1.size())) res=new ArrayList<>(res1);

    //打连对
    res1 = getMincount(arr,index,3,2);
    if(res.isEmpty()||(res1.size()!=0&&res.size()>res1.size())) res=new ArrayList<>(res1);

    return res;
}

/**
 * @param arr  牌数
 * @param index 从index开始
 * @param num   打连续num种牌
 * @param count  每张牌打count张
 * @return
 */
private static List> getMincount(int[] arr, int index,int num, int count){

    List> reslist = new ArrayList<>();

    //判断一下是否可以出牌
    if(arr.length-index();
    List lst = new ArrayList<>();
    for(int k=index;k();
    }
    reslist.add(lst);

    //出牌
    operate(arr,index,num,-1*count);
    //dfs
    reslist.addAll(dfs(arr, index));
    //回溯
    operate(arr,index,num,count);
    return reslist;
}

private static void operate(int[] arr, int index,int num,int add){
    if(arr.length-index

输入一个正整数n和n行升序的字符串,可以进行任意个字符串拼接,求最长升串;

(笔试时没来得及保存就到点系统交卷了,所以,嗯)

public static void main(String[] args) {
    //输入
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.nextLine();
    List list=new ArrayList<>();
    for(int i = 0; i < n; i++)
        list.add(i, sc.nextLine());

    //lambda排序,按首字母和字符串长度排序
    list.sort((o1, o2) -> {
        if (o1.charAt(0) == o2.charAt(0))
            return o2.length() > o1.length() ? 1 : 0;
        else
            return o2.charAt(0) < o1.charAt(0) ? 1 : -1;
    });

    //dp
    int[] dp = new int[n];
    dp[0]=list.get(0).length();
    int res = 0;
    for(int i=1;i=0;j--){
            if(list.get(i).charAt(0)

 

你可能感兴趣的:(Java)