2018-11-11 算法练习题

下面是几道算法练习题:

package java算法;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**
 * 
 * @author 刘慧丽
 * 
 * 几道算法题
 *
 */

public class Test2 {

    private static Scanner input = new Scanner(System.in);

    /**
     * 每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,
     * 系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。
     * 但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
     * 
     * 输入格式:
     * 
     * 输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。
     * 其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
     * 
     * 考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。
     * 
     * 输出格式:
     * 
     * 对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。
     * 
     * 输入样例: 4 10120150912233 2 4 10120150912119 4 1 10120150912126 1 3
     * 10120150912002 3 2 2 3 4 输出样例: 10120150912002 2 10120150912119 1
     */
    public static void Test01() {
        int n = Integer.parseInt(input.nextLine());
        Map<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < n; i++) {
            String str = input.nextLine();

            String[] s = str.split(" ");
            map.put(s[1], s[0] + " " + s[2]);
        }
        int m = Integer.parseInt(input.nextLine());
        int[] arr = new int[m];
        for (int i = 0; i < m; i++) {
            arr[i] = input.nextInt();
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(map.get(String.valueOf(arr[i])));
        }

    }

    /**
     * 输入样例: This is a simple TEST. There ARE numbers and other symbols
     * 1&2&3........... 输出样例: e 7
     */
    public static void Test02() {
        String str = input.nextLine().toLowerCase();
        int[] arr = new int[123];
        int max = 0;
        int min = 123;
        for (int i = 0; i < str.length(); i++) {
            if (((int) str.charAt(i) > 96 && (int) str.charAt(i) < 123)) {
                arr[str.charAt(i)]++;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
                min = i;
            }
        }
        System.out.println((char) min + " " + max);

    }

    /**
     * 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“PATestPATest....”这样的顺序输出,
     * 并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直到所有字符都被输出。
     * 
     * 输入格式:
     * 
     * 输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
     * 
     * 输出格式:
     * 
     * 在一行中按题目要求输出排序后的字符串。题目保证输出非空。
     * 
     * 输入样例: redlesPayBestPATTopTeePHPereatitAPPT 输出样例: PATestPATestPTetPTePePee
     */

    public static void Test03() {
        String str = input.nextLine();
        char[] ch = { 'P', 'A', 'T', 'e', 's', 't' };
        int[] value = new int[123];
        for (int i = 0; i < str.length(); i++) {
            if (ch[0] == str.charAt(i)) {
                value[ch[0]]++;
            } else if (ch[1] == str.charAt(i)) {
                value[ch[1]]++;
            } else if (ch[2] == str.charAt(i)) {
                value[ch[2]]++;
            } else if (ch[3] == str.charAt(i)) {
                value[ch[3]]++;
            } else if (ch[4] == str.charAt(i)) {
                value[ch[4]]++;
            } else if (ch[5] == str.charAt(i)) {
                value[ch[5]]++;
            } else {

            }
        }
        int count = 0;
        while (true) {
            for (int i = 0; i < 6; i++) {
                if (value[ch[i]] == 0) {
                    count++;
                } else {
                    System.out.print(ch[i]);
                    value[ch[i]]--;
                }

            }
            if (count == 6) {
                break;
            }
        }

    }

    /**
     * 本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。
     * 要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
     * 
     * 输入格式:
     * 
     * 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
     * 
     * 输出格式:
     * 
     * 输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
     * 
     * 输入样例: 12 37 76 20 98 76 42 53 95 60 81 58 93 ,94输出样例: 98 95 93 42 37 81
     * 53 20 76 58 60 76
     */
    public static void Test04() {
        int N = input.nextInt();
        int[] arr = new int[N];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = input.nextInt();
        }

        int n = (int) Math.sqrt(N);
        int m_v = 1;
        int n_v = 1;
        int min = n;
        for (int i = n; i > 1; i--) {
            if (N % i == 0) {
                if (N / i - i <= min && (N / i - i >= 0)) {
                    min = N / i - i;
                    n_v = i;
                    m_v = N / i;
                }
            }

        }
        Arrays.sort(arr);
        int i = 1, j = 0, k = 0, flag = 0, sign = 0;
        int[][] arry = new int[m_v][n_v];

        for (i = 1; i <= m_v * n_v;) {
            for (k = 0 + flag; k < n_v - flag; k++) {
                arry[j + sign][k] = arr[i - 1];
                i++;
            }
            for (j = 1 + flag; j < m_v - flag; j++) {
                arry[j][k - 1] = arr[i - 1];
                i++;
            }
            for (k = k - 2; k >= 0 + flag; k--) {
                arry[j - 1][k] = arr[i - 1];
                i++;
            }
            for (j = j - 2; j >= 1 + flag; j--) {
                arry[j][k + 1] = arr[i - 1];
                i++;
            }
            flag++;
            sign = 1;
        }
        for (i = 0; i < m_v; i++) {
            for (j = 0; j < n_v; j++)
                System.out.print(arry[i][j] + " ");
            System.out.println();
        }

    }

    /**
     * 
     * 英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数”E,即满足有E天骑车超过E英里的最大整数E。
     * 据说爱丁顿自己的E等于87。
     * 
     * 现给定某人N天的骑车距离,请你算出对应的爱丁顿数E(<=N)。
     * 
     * 输入格式:
     * 
     * 输入第一行给出一个正整数N(<=105),即连续骑车的天数;第二行给出N个非负整数,代表每天的骑车距离。
     * 
     * 输出格式:
     * 
     * 在一行中给出N天的爱丁顿数。
     * 
     * 输入样例: 10 6 7 6 9 3 10 8 2 7 8 输出样例: 6
     */
    public static void Test05() {
        int n = input.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = input.nextInt();
        }
        Arrays.sort(arr);
        int max = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > arr.length - i) {
                if (arr.length - i > max) {
                    max = arr.length - i;
                }
            }
        }

        System.out.println(max);
    }

    /**
     * C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
     * 
     * 0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。 1. 排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶! 2.
     * 其他人将得到巧克力。
     * 
     * 给定比赛的最终排名以及一系列参赛者的ID,你要给出这些参赛者应该获得的奖品。
     * 
     * 输入格式:
     * 
     * 输入第一行给出一个正整数N(<=10000),是参赛者人数。随后N行给出最终排名,每行按排名顺序给出一位参赛者的ID(4位数字组成)。
     * 接下来给出一个正整数K以及K个需要查询的ID。
     * 
     * 输出格式:
     * 
     * 对每个要查询的ID,在一行中输出“ID: 奖品”,其中奖品或者是“Mystery
     * Award”(神秘大奖)、或者是“Minion”(小黄人)、或者是“Chocolate”(巧克力)。如果所查ID根本不在排名里,打印“Are
     * you kidding?”(耍我呢?)。如果该ID已经查过了(即奖品已经领过了),打印“ID: Checked”(不能多吃多占)。
     * 
     * 输入样例: 6 1111 6666 8888 1234 5555 0001 6 8888 0001 1111 2222 8888 2222
     * 输出样例: 8888: Minion 0001: Chocolate 1111: Mystery Award 2222: Are you
     * kidding? 8888: Checked 2222: Are you kidding?
     * 
     */
    public static void Test06() {
        String[] str = { "Mystery Award", "Minion", "Chocolate", "Checked" };
        List<String> list = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();

        int N1 = input.nextInt();
        for (int i = 0; i < N1; i++) {
            list.add(input.nextLine());
        }
        int N2 = input.nextInt();
        for (int i = 0; i < N2; i++) {
            list2.add(input.nextLine());
        }
        int[] arr = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            if ((i + 1) == 1) {
                arr[i] = 0;
            } else if ((i + 1) % 2 != 0) {
                arr[i] = 2;
            } else {
                arr[i] = 1;
            }
        }
        for (int i = 0; i < list2.size(); i++) {
            if (list.contains(list2.get(i))) {
                int n = list.indexOf(list2.get(i));
                System.out.println(list2.get(i) + ":" + str[arr[n]]);
                arr[n] = 3;

            } else {
                System.out.println(list2.get(i) + ":" + " Are you kidding?");
            }
        }

    }

    public static void main(String[] args) {
        // Test01();
        // Test02();
        // Test03();
        Test04();
        // Test05();
        // Test06();

    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 相信每一位玩ACM程序设计竞赛的同学来说,都有一个从入门到精通的过程,而且分享他们经验的时候,见到最多的就是一种合...
    FinlayLiu阅读 5,333评论 6 182
  • 淅淅沥沥的雨下个不停。 穿着白色帆布鞋,带着日常的瑜伽装备(瑜伽教材+瑜伽服+水杯+笔记本+笔,外加一颗虔诚的瑜伽...
    Mia冬阅读 744评论 0 0
  • 越发不爱说话。 这个结果好像是很久以前的预兆终于到来了一样。我似乎一直在等着被宣判社交无能,然后找到借口不说话。 ...
    时光时光慢些吧阅读 970评论 0 0
  • 连日来今天的小雨,使深秋的天气更加冷了几分,看那些匆匆走在路上的行人,跟前几天阳光明媚的天气比起来人们的衣服加...
    超赢笑看人生阅读 436评论 0 0
  • 一只小猫 在夏雨的夜晚, 迷失在了黑暗中。 它的哭声 被雨冲的支离破碎 一部分给了水洼 一部分丢向人们 还有一部分...
    晨光微晓阅读 234评论 0 0