Java OpenJudge-test4

目录

1:字符串排序

2:翻转后排序

3:括号匹配2

4:求课程交集

5:扑克牌排序


1:字符串排序

总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB

描述

给定N个字符串,将这N个字符串按照长度从小到大排序,对于长度相同的字符串按照字典序从大到小排序。

输入

第一行一个整数N(不超过100)
接下来N行每行一个长度不超过50的字符串,仅包含小写字母

输出

N行,表示排序后的字符串

样例输入

3
zzz
ab
ba

样例输出

ba
ab
zzz

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        List<String> list1 = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String s = sc.nextLine();
                list1.add(s);
        }
        Collections.sort(list1, new Comparator1());
        for (String ss : list1) {
            System.out.println(ss);
        }
    }
}

class Comparator1 implements Comparator<String> {
    public int compare(String a, String b) {
        if (a.length() == b.length()) {
            return b.compareTo(a);
        }
        return a.length() - b.length();
    }
}

2:翻转后排序

总时间限制: 5000ms        单个测试点时间限制: 1000ms        内存限制: 65535kB

描述

给定整数n,请将1到n的所有整数重新排序,使得翻转后越大的数排名越靠前。这里翻转指将一个数的十进制表示翻转,例如123翻转后是321;100翻转后是1。如果两个数翻转后大小相同,则翻转前越小的数排名越靠前。

输入

一个整数n(n<=1000)

输出

一行n个整数表示排序后的结果

样例输入

11

样例输出

11 9 8 7 6 5 4 3 2 1 10

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
        for (int i = 1; i <= n; i++) {
            String s = i + "";
            StringBuffer ss = new StringBuffer(s);
            String reverse_s = ss.reverse().toString();
//            int r_s = Integer.parseInt(reverse_s);
            map.put(i, Integer.parseInt(reverse_s));
        }
        List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                if (o1.getValue() == o2.getValue()) {
                    return o1.getKey() - o2.getKey();
                }
                return o2.getValue() - o1.getValue();
            }
        });
        for (Map.Entry<Integer, Integer> num : list) {
//            System.out.println("key:" + entry.getKey() + ";value:" + entry.getValue());
            System.out.print(num.getKey() + " ");
        }
    }
}

3:括号匹配2

总时间限制: 5000ms    单个测试点时间限制: 500ms    内存限制: 262144kB

描述

给出一个由小括号、中括号、大括号组成的括号字符串,判断它是否合法。

输入

第一行包含1个正整数 T,表示测试数据组数。
接下去 T 行,每行一个仅由小括号、中括号、大括号组成的字符串。

对于 100% 的数据,1<=T<=10,1<=每行的字符串长度<=10000;

输出

一共 T 行,每行一个答案,如果为合法括号串,则输出yes;否则输出no;

样例输入

4
([]){}
)([]
{({})()[{}[[]]]}
[]{)}((()

样例输出

yes
no
yes
no

import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < n; i++) {
            String s = sc.nextLine();
            if (isGoodBracket(s)) System.out.println("yes");
            else System.out.println("no");
        }
    }

    public static boolean isGoodBracket(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(') stack.push(')');
            if (c == '[') stack.push(']');
            if (c == '{') stack.push('}');

            if (c == ')' || c == ']' || c == '}') {
                if (stack.empty()) {
                    return false;
                }
                if (stack.pop() != c) {
                    return false;
                }
            }
        }

        if (!stack.empty()) {
            return false;
        }
        return true;
    }
}

4:求课程交集

总时间限制:        65535ms        内存限制:        65535kB

描述

输入多个同学所选的课程,求这些同学所选课程的交集。

输入

首先输入一个数n,表示一共有几位同学,接着输入n行,每行表示该名同学所选的课程编号,每个课程编号之间有空格间隔。

输出

输出n位同学都选了的课程编号,即所选课程的交集,若有多个课程,则每行输出一个,输出顺序由课程编号从小到大,若无交集,则输出None

样例输入

3
122 221 110
110 222 334
110 222 234

样例输出

110

 方法一:

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        List<String> list1=new ArrayList<>();
        for (String s : sc.nextLine().split(" ")) {
            list1.add(s);
        }
        for (int i = 0; i < n-1; i++) {
            List<String> list2=new ArrayList<>();
            for (String s : sc.nextLine().split(" ")) {
                list2.add(s);
            }
            list1.retainAll(list2);
            if(list1.size()==0){
                System.out.println("None");
                return;
            }
        }
        Collections.sort(list1);
        for (String s : list1) {
            System.out.println(s);
        }
    }
}

方法二:

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
 
public class Main {
    public static void main(String[] args) {
        Scanner p = new Scanner(System.in);
        Map<String, Integer> k = new TreeMap<String, Integer>();
        int n = p.nextInt();
        p.nextLine();
        for (int i = 0; i < n; i++) {
            String m = p.nextLine();
            String[] s1 = m.split(" ");
            for (String str : s1) {
                if (k.get(str) == null)
                    k.put(str, 1);
                else
                    k.put(str, k.get(str) + 1);
            }
        }
        Boolean flag = true;
        for (String str : k.keySet()) {
            if (k.get(str) == n) {
                System.out.println(str);
                flag = false;
            }
        }
        if (flag)
            System.out.println("None");
    }
}

5:扑克牌排序

总时间限制:        1000ms        内存限制:        262144kB

描述

桥牌是一项两人对两人的四人扑克游戏。游戏过程分为叫牌和打牌,需要精确计算牌力,并和队友默契配合,是一项普及面很广的、有趣、益智的游戏。

这里我们不讨论复杂的叫牌体系和打牌规则,只讨论拿到一手牌后的排序过程(俗称理牌)。下图就是一副已经理好的牌。e486d25384156c2ba57b6ee524315493.png

理牌规则如下:
1. 同花色放在一起,花色之间按照 黑桃S、红心H、草花C、方片D 的顺序排放(为了使颜色交替,容易区分,本题理牌顺序如图为 黑桃 > 红心 > 草花 > 方片,与桥牌叫牌的顺序不同);
2. 同花色中,按从大到小的顺序排放,即 A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2(即A最大,2最小);

现在给你一手牌,请按照上述理牌规则将其排序。

输入

输入一行,表示一手牌(保证为 13 张牌),每张牌用花色+大小表示。
花色为:S (表示Spade黑桃)、H (表示Heart红心)、C (表示Club草花)、D (表示Diamond方片);
大小为:A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2;
一张牌的花色和大小之间无空格,所有字母均大写,保证没有重复的牌。牌与牌之间有 1 个空格。行首行尾均无多余空格。

输出

输出一行,即排好序的这手牌。输出格式与输入一致。

样例输入

#样例输入1
H2 S3 C3 D5 H6 C9 H9 C10 HJ SQ DQ SK CA
 

#样例输入2
CA CK CQ CJ C10 C9 S2 S3 S4 S5 S6 S7 S8
 

#样例输入3
SA HA CA DA SK HK CK DK SQ HQ DQ CQ SJ

样例输出

#样例输出1
SK SQ S3 HJ H9 H6 H2 CA C10 C9 C3 DQ D5
 

#样例输出2
S8 S7 S6 S5 S4 S3 S2 CA CK CQ CJ C10 C9
 

#样例输出3
SA SK SQ SJ HA HK HQ CA CK CQ DA DK DQ

方法一:

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        LinkedList<String> list1 = new LinkedList<>();
        for (int i = 0; i < 13; i++) {
            list1.add(sc.next());
        }
        Collections.sort(list1, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
               String[] t1={"S","H","C","D","A","K","Q","J","10","9","8","7","6","5","4","3","2"};
                String[] t2={"d","c","b","a","z","y","x","w","v","u","t","s","r","q","p","o","n"};
 
                for (int i = 0; i < t1.length; i++) 
                {
                    o1=o1.replace(t1[i],t2[i]);
                    o2=o2.replace(t1[i],t2[i]);
                }
                return o2.compareTo(o1);
            }
        });
        for (String s : list1) {
            System.out.print(s+" ");
        }
    }
}

方法二:

import java.util.ArrayList;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] arg) {
        Scanner sc = new Scanner(System.in);
        String[] s1 = { "S", "H", "C", "D" };
        String[] s2 = { "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2" };
        ArrayList<String> s = new ArrayList<String>();
        for (int i = 0; i < 13; i++)
            s.add(sc.next());
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (s.contains(s1[i] + s2[j])) {
                    System.out.print(s1[i] + s2[j] + " ");
                }
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见以前说再见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值