小景哥哥

世界很大,而我们还需要再成长!

强烈推荐

1032. 挖掘机技术哪家强(20)-浙大PAT乙级真题java实现

    1032. 挖掘机技术哪家强(20) 
    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 
    输入格式: 
    输入在第1行给出不超过10^5的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。 
    输出格式: 
    在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。 
    输入样例: 

    3 65 
    2 80 
    1 100 
    2 70 
    3 40 
    3 0 
    输出样例: 
    2 150


    阅读全文>>

作者:Jason分类:【pat浏览(91评论(0

2018-01-19

1023. 组个最小数 (20)-浙大PAT乙级真题java实现

    1023. 组个最小数 (20) 
    给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。现给定数字,请编写程序输出能够组成的最小的数。 
    输入格式: 
    每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥 
    有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。 
    输出格式: 
    在一行中输出能够组成的最小的数。 
    输入样例: 
    2 2 0 0 0 3 0 0 1 0 
    输出样例: 
    10015558


    阅读全文>>

作者:Jason分类:【pat浏览(58评论(0

2018-01-17

变态跳台阶

    9.变态跳台阶

    题目描述
    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    解题思路:

    关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:

            f(1) = 1

            f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数。

            f(3) = f(3-1) + f(3-2) + f(3-3) 

            ...

            f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n) 

            说明: 

            1)这里的f(n) 代表的是n个台阶有一次1,2,...n阶的 跳法数。

            2)n = 1时,只有1种跳法,f(1) = 1

            3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2) 

            4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,

                那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)

                因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)

            5) n = n时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

                f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1)  

            6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:

                f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

                f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)

                可以得出:

                f(n) = 2*f(n-1)

            7) 得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

                       | 1       ,(n=0 ) 

            f(n) =  | 1       ,(n=1 )

                       | 2*f(n-1),(n>=2)

    //java代码实现
      public class Solution {

      public int JumpFloorII(int target) {
            if (target <= 0) {
                return -1;
            } else if (target == 1) {
                return 1;
            } else {
                return 2 * JumpFloorII(target - 1);
            }
        }

        //Another solution
        public int JumpFloorII2(int target){
            int a=1; 
            return a<<(target-1);
        }
    }

    阅读全文>>

作者:Jason分类:【offer浏览(42评论(0

2018-08-10

64.滑动窗口的最大值

    64.滑动窗口的最大值

    题目描述

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

    import java.util.ArrayList;
    import java.util.ArrayDeque;
    public class Solution {
        /**
        用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次
        1.判断当前最大值是否过期
        2.新增加的值从队尾开始比较,把所有比他小的值丢掉
        */
        public ArrayList<Integer> maxInWindows(int [] num, int size)
        {
            ArrayList<Integer> res = new ArrayList<>();
            if(size == 0) return res;
            int begin; 
            ArrayDeque<Integer> q = new ArrayDeque<>();
            for(int i = 0; i < num.length; i++){
                begin = i - size + 1;
                if(q.isEmpty())
                    q.add(i);
                else if(begin > q.peekFirst())
                    q.pollFirst();
             
                while((!q.isEmpty()) && num[q.peekLast()] <= num[i])
                    q.pollLast();
                q.add(i);  
                if(begin >= 0)
                    res.add(num[q.peekFirst()]);
            }
            return res;
        }
    }
    阅读全文>>

作者:Jason分类:【offer浏览(34评论(0

2018-08-25

32.把数组排成最小的数

    32.把数组排成最小的数

    题目描述

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
     


    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    public class Solution {
        public String PrintMinNumber(int [] numbers) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            
            for(int i = 0; i < numbers.length; i++)
                list.add(numbers[i]);
            
            Collections.sort(list, new Comparator<Integer>(){
                public int compare(Integer str1, Integer str2){
                    String s1 = str1 + "" + str2;
                    String s2 = str2 + "" + str1;
                    return s1.compareTo(s2);
                }
            });
            String str = "";
            for(int i : list)
                str += i;
            return str;
        }
    }

     

    阅读全文>>

作者:Jason分类:【offer浏览(23评论(0

2018-08-23

1072. 开学寄语(20)–PAT乙级真题java实现

    1072. 开学寄语(20)–PAT乙级真题java实现
     
    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也! 
    本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器。 
    输入格式: 
    输入第一行给出两个正整数N(<= 1000)和M(<= 6),分别是学生人数和需要被查缴的物品种类数。第二行给出M个需要被查缴的物品编号,其中编号为4位数字。随后N行,每行给出一位学生的姓名缩写(由1-4个大写英文字母组成)、个人物品数量K(0 <= K <= 10)、以及K个物品的编号。 
    输出格式: 
    顺次检查每个学生携带的物品,如果有需要被查缴的物品存在,则按以下格式输出该生的信息和其需要被查缴的物品的信息(注意行末不得有多余空格): 
    姓名缩写: 物品编号1 物品编号2 …… 
    最后一行输出存在问题的学生的总人数和被查缴物品的总数。 
    输入样例: 
    4 2 
    2333 6666 
    CYLL 3 1234 2345 3456 
    U 4 9966 6666 8888 6666 
    GG 2 2333 7777 
    JJ 3 0012 6666 2333 
    输出样例: 
    U: 6666 6666 
    GG: 2333 
    JJ: 6666 2333 
    3 5
     
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Main {
        
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] s = br.readLine().trim().split(" ");
            int N = Integer.parseInt(s[0]);
            int M = Integer.parseInt(s[1]);
            String[] thing = br.readLine().split(" ");
            int stuTol = 0, thTol = 0;
            for(int i = 0; i < N; i++) {
                String[] temp = br.readLine().split(" ");
                boolean flag = false;
                for(int j = 2; j < temp.length; j++) {
                    for(int k = 0; k < M; k++) {
                        if(temp[j].equals(thing[k])) {
                            thTol++;
                            if(flag) {
                                System.out.print(" " + temp[j]);
                            }else {
                                System.out.print(temp[0] + ": " + temp[j]);
                            }
                            flag = true;
                        }
                    }
                }
                if(flag) {
                    stuTol++;
                    System.out.println();
                }
            }
            System.out.println(stuTol + " " + thTol);
        }
    }
    阅读全文>>

作者:Jason分类:【pat浏览(54评论(0

2018-09-15

调整数组顺序使奇数位于偶数前面

    13.调整数组顺序使奇数位于偶数前面

    题目描述

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

     

    解题思路:

    从头到尾遍历数组,遇到第一个偶数,标记其位置,遇到奇数时,从此奇数到标记的偶数之间做调整,此奇数与最邻近的前一个数交换,直到达到标记偶数位置。

     

        public void reOrderArray(int [] array) {

            int index = -1;

            int indexOdd = -1;

            boolean flag = false;

            for(int i = 0; i < array.length; i++){

                if(array[i] % 2 == 0){

                    if(!flag)

                        indexOdd = i;

                    flag = true;

                }

                if((array[i] % 2 == 1) && flag){

                    for(int j = i; j > indexOdd; j--){

                        int temp = array[j];

                        array[j] = array[j - 1];

                        array[j - 1] = temp;

                    }

                    indexOdd++;

                }

            }

        }

    阅读全文>>

作者:Jason分类:【offer浏览(34评论(0

2018-08-13

五月,你好!

     

          

    五月,你好。绿豆冰、杏皮水、酸梅汤,阳光下白衬衫男生的侧脸,都是喜欢的夏天的味道。活力与激情,疲惫与颓废,都恰到好处地统一在透彻明亮的阳光里。愿你阳光里像个孩子,风雨里是个大人。愿你拥有和生活博弈的能力和胆量,愿你珍惜陪你走过一程的良师益友。愿你想要的明天,都会如约而至。

    岁月的脚步总是匆匆,让你无法去阻止它能逗留半分半秒。过去的一个四月,有喜悦,有收获,有惆怅,有纠结,这一切好的不好的,都成为了过去。

    五月,你好。天空沉静,草木欣然,温和而不疏淡,热烈而不拘束。听五月的淅沥,感受一点又一点的小欢喜。

    五月,我会好好去享受,不会虚度,不会焦虑,一切按心中的计划去实施。最痛苦的不是失败的泪水而是不曾尽力的懊悔。别让明天的你,讨厌今天的自己岁月更替,四季轮回,哪怕未能赏尽春光,也莫道岁月晚,不蹉跎,不虚度,不念过往,不畏将来。

    在五月,给自己一个全新的开始,认真洗脸,多读书,按时睡觉,少食多餐,热爱当前。让过去过去,让未来发生。岁月必不会辜负诚恳的每一天。光阴不扰,山水静候。与世界交手的好多年,你是否光彩依旧,兴致盎然?你听——又是蝉鸣的夏天。

    五月,一切都是新的开始。不要总在过去的回忆里缠绵,昨天的太阳,晒不干今天的衣裳!遗忘一些人,珍藏一些事,日子总要向前看。

    五月,努力做自己。从今天起,往事不再回头,今后不必将就。努力生活,努力成长,努力做自己。用最乐观的态度、最积极的心情对自己说一句:五月你好!

    五月,学会感恩。出现在你生命中的人,有的是为了欣赏你,有的是为了心疼你,有的是为了磨炼你,有的是为了教育你。但无论如何,你都要感谢他们每一个人,因为上帝让他们,最终成全了你,完善了你。

    五月,请更努力一点。每个明天都是由今天开始的,希望有什么样的未来,今天就要做什么样的努力。不求事事顺心,只愿事事尽心。

    五月伊始,对自己好一点。不必在人前暴露自己的苦楚,因为从来没有真正的感同身受;也不要轻易把伤疤揭开给别人看,你以为那个人是医生,实际上他只是个路人。

    五月,试着一个人静静面对,自己把道理想通,在一切变好之前,总要经历一些不开心的日子。就连一朵花开,都要接受雨雪风霜。所有让你困顿的,都只能让你更加成熟强大。所有让你肝肠寸断的苦难,未来某一天,你都云淡风轻地谈起。所有让你悲欢离合的故事,都会在几个春秋之后,成为你一笑而过的下酒菜。

    五月,愿你一切安好。愿你懂得世故而不世俗,懂生存而不顺流而下。愿你特别美丽特别坚毅特别温柔,愿你在困境中心怀善意。愿你在冷铁卷刃前也能窥见天光。愿失去的都能释怀,拥有的加倍珍惜。愿活成自己喜欢的模样,温柔岁月,惊艳时光。愿你雨天有伞,兜里有糖。想要的都拥有,得不到的都释怀。愿你出走半生,归来仍是少年。

    四月,再见!

    五月,你好!

     

    阅读全文>>

作者:Jason分类:【纪念浏览(106评论(0

2018-05-01

欢迎关注小景哥哥微信公众号

    欢迎关注小景哥哥微信公众号,每天一篇为您推送,愿我的点滴感悟能给您的生活带来一丝暖意。


    阅读全文>>

作者:Jason分类:【notice浏览(101评论(0

2018-04-14

66.机器人的运动范围

    66.机器人的运动范围

    题目描述

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
     


    public class Solution {
        public int movingCount(int threshold, int rows, int cols) {
            int flag[][] = new int[rows][cols]; //记录是否已经走过
            return helper(0, 0, rows, cols, flag, threshold);
        }
     
        private int helper(int i, int j, int rows, int cols, int[][] flag, int threshold) {
            if (i < 0 || i >= rows || j < 0 || j >= cols || numSum(i) + numSum(j)  > threshold || flag[i][j] == 1) 
                return 0;    
            flag[i][j] = 1;
            return helper(i - 1, j, rows, cols, flag, threshold)
                + helper(i + 1, j, rows, cols, flag, threshold)
                + helper(i, j - 1, rows, cols, flag, threshold)
                + helper(i, j + 1, rows, cols, flag, threshold)
                + 1;
        }
     
        private int numSum(int i) {
            int sum = 0;
            do{
                sum += i%10;
            }while((i = i/10) > 0);
            return sum;
        }
    }
    阅读全文>>

作者:Jason分类:【offer浏览(39评论(0

2018-08-25