小景哥哥

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

强烈推荐

41.和为S的连续正数序列

    41.和为S的连续正数序列

    题目描述

    小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
    输出描述:
    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

     


    import java.util.ArrayList;
    public class Solution {
        public ArrayList<ArrayList<Integer> > FindContinuousSequence1(int sum) {
            ArrayList<ArrayList<Integer>> alllist = new ArrayList<ArrayList<Integer>>();
           if(sum < 3)
               return alllist;
            int small = 1;
            int big = 2;
            int middle = (1 + sum) / 2;
            int curSum = small + big;
            while(small < middle){
                if(curSum == sum){
                    ArrayList<Integer> list = new ArrayList<Integer>();
                    for(int i = small; i <= big; i++)
                        list.add(i);
                    alllist.add(list);
                }
                while(curSum > sum && small < middle){
                    curSum -= small;
                    small++;
                    if(curSum == sum){
                        ArrayList<Integer> list = new ArrayList<Integer>();
                        for(int i = small; i <= big; i++)
                            list.add(i);
                        alllist.add(list);
                    }
                }
                big++;
                curSum += big;
            }
            return alllist;
        }

    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
            ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
            for (int n = (int) Math.sqrt(2 * sum); n >= 2; n--) {
                if ((n & 1) == 1 && sum % n == 0 || (sum % n) * 2 == n) {
                    ArrayList<Integer> list = new ArrayList<>();
                    for (int j = 0, k = (sum / n) - (n - 1) / 2; j < n; j++, k++) {
                        list.add(k);
                    }
                    ans.add(list);
                }
            }
            return ans;
        }
    }

     

    阅读全文>>

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

2018-08-24

程序员的“二”人世界

    世界上每一个程序员都是一个标准二货,彻彻底底完完全全的二货,二的63次方减一,这可是世界上最大的整数了(由此暴露了一个Java程序员的身份),再大就要溢出,它全是由2组成的。计算机是二进制的,计算机是程序员的梦中情人,由此而来程序员的世界就是一个2和情人的世界,从而组成了完美的“二”人世界。

    程序员的脑子都是二进制的,他们数数就是2,4,8,16,32,64,128,256,512,1024,…,就像你张口就来的0,1,2,3,4,5,6,7,8,9,10,他们对1024极其敏感,就像你每次买东西都想凑个整数,不管是10还是100. 有一次,一个哥们借我1000块钱,好像过了很久打算还我,但是觉得时间那么长了,有点不好意思,于是就说,给你凑个整给你1024好了,也不差那点钱。

    程序员有种职业病,就是看到啥缩写字母都会想到编程语言里的简写。有一次,我们大家在一起讨论一个热播美剧《破产姐妹》,因为剧情尺度确实有点大,而且还需要了解很深的美国文化才能get到他们的笑点,当有人谈论到Max整天挂在嘴边的hang、ball、gc的时候,旁边一哥们不假思索地就问他们也那么积极的垃圾回收么?看来美国文明程度确实很高啊。啥?啥垃圾回收?Garbage Collection啊,一看你就Java基础没学好,回去赶紧恶补Java虚拟机啊。

    在程序员眼里,世界上最高尚的职业就是人民教师,从古自今教师都是被世人尊敬的群体,为人师表的教师之所以那么伟大,不就是因为他们每年都有一个属于自己的节----教师节么,其他任何职业都没有这种优厚的待遇吧。但是只有一个例外,10.24是我们程序员的节日(此处应该有2的63次方减一个赞),哈哈哈,大笑三声,独属、专属、唯一的一个属于这个特定职业的节日,虽然没法和过节假日的老师们相提并论,但是程序员们已经相当满足、相当满意。

    程序员们都有强迫症----灭bug大神。不管是遇到404,还是500,还是303,他们一句fuck之后就开始蛮干,直到修复为止,从不放弃。当他们看到你电脑还在用着过时的win7、win8的时候,总是情不自禁的想帮你换成win10,他们总想给你插内存条、电脑清灰、换SSD。不是说他们有多热情,而是…因为职业病。他们的电脑手机iPad每个都是最新款最高配,每个软件都是最新版,还会强迫你去更新最新软件,强迫你去更新最新系统。所以不要在程序员面前显摆你的电子设备有多牛逼,他们都不屑去看你那些过时的电子古董。

    程序员们都有一个梦中情人,那就是华丽炫酷顶配的电脑。CPU肯定是八代intel i7 8700k标配(脑残发烧友上i9),搭载英伟达显卡1080Ti或Titan,主板不用玩家国度ROG就觉得对不起自己小小的内心,内存条上美商海盗船或耀眼的芝奇3200Hz,而且一上来就32G或64G,360分体式水冷,纯透明钢化玻璃机箱配备炫酷灯,4K超清曲面显示屏,炫酷的一逼,不管是玩游戏吃鸡还是撸代码,这都是刚需。他们看高配电脑的眼神,就像你们看到美女一样,远远的凝视不愿离去。

           咳,咳,程序员都很自恋,请为IT小哥哥们打call!

           一人我编程累

    碎过了节操心沉醉

    两眼是Code相随

    不求他日能早归

    鼠标我轻点屏

    键盘我手速行

    痴情代码

    心甘情愿

    千里把那个bug寻

    说项目呵呵笑

    PM主意太奇妙

    我轻狂那太高傲

    我懵懂的无知太年少

    赶进度,没班下

    上线了产品还牵挂

    千古的留名传佳话

    我三年架构已白发

    天天加班何人陪

    谁是谁非谁相随

    全栈通吃为了谁

    我能写几回,测几回

    败硬件,斗时间

    提高了并发已成仙

    豪情万丈天地间

    我续写了另类码农篇

    红尘事我已斩断

    久居帝都人心乱

    当年房价没上万

    我 为这了没买留遗憾

    创业我愁断肠

    眼中我泪两行

    多年为君早日上市

    一朝敲钟把名扬

     

    爱情是什么鬼

    谁信谁就脑进水

    谁错谁对谁是谁非

    深夜我把代码怼

    性能我心头事

    此生我怀大志

    为了老板回眸一笑

    我立下这毒誓

    VR我常相伴

    AI我深度上

    回眸沧海

    一曲忧伤

    感触盒饭香

    项目实施人在外

    我归来之日谁还在

    兄弟写码论豪迈

    我驰骋职场求一败

    程序员我们都是傻逼

    编程语言改变了哥的口味

    C++,JAVA,PHP

    许多年前还要学VB

    找不到对象毫不诡异

    茶不思饭不想视死如归

    寂寞的时候干什么?

    写程序写程序

    失恋的时候干什么?

    写程序写程序写程序

    发骚的时候干什么?

    写程序写程序

    剩下的时候干什么?

    调程序调程序调程序

     

    阅读全文>>

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

2018-04-12

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浏览(249评论(0

2018-08-25

54.字符流中第一个不重复的字符

    54.字符流中第一个不重复的字符

    题目描述

    请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
    输出描述:
    如果当前字符流没有存在出现一次的字符,返回#字符。

     



    public class Solution {

    int[] hashtable = new int[256];
        StringBuffer s = new StringBuffer();
        //Insert one char from stringstream
        public void Insert(char ch)
        {
            s.append(ch);
            if(hashtable[ch] == 0)
                hashtable[ch] = 1;
            else hashtable[ch] += 1;
        }
      //return the first appearence once char in current stringstream
        public char FirstAppearingOnce()
        {
          char[] str=s.toString().toCharArray();
          for(char c:str)
          {
              if(hashtable[c] == 1)
                  return c;
          }
          return '#';
        }
    }

    阅读全文>>

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

2018-08-24

1066. 图像过滤(15)–PAT乙级真题java实现

    1066. 图像过滤(15)–PAT乙级真题java实现
     
    图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来。现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换。
    输入格式:
    输入在第一行给出一幅图像的分辨率,即两个正整数M和N(0 < M, N <= 500),另外是待过滤的灰度值区间端点A和B(0 <= A < B <= 255)、以及指定的替换灰度值。随后M行,每行给出N个像素点的灰度值,其间以空格分隔。所有灰度值都在[0, 255]区间内。
    输出格式:
    输出按要求过滤后的图像。即输出M行,每行N个像素灰度值,每个灰度值占3位(例如黑色要显示为000),其间以一个空格分隔。行首尾不得有多余空格。
    输入样例:
    3 5 100 150 0
    3 189 254 101 119
    150 233 151 99 100
    88 123 149 0 255
    输出样例:
    003 189 254 000 000
    000 233 151 099 000
    088 000 000 000 255
     
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) throws IOException{
            Scanner sc = new Scanner(System.in);
            int M = sc.nextInt(), N = sc.nextInt(), A = sc.nextInt(),
                     B = sc.nextInt(), filter = sc.nextInt();
            for(int i = 0; i < M; i++) {
                for(int j = 0; j < N; j++) {
                    int rgb = sc.nextInt();
                    if(rgb >= A && rgb <= B) {
                        rgb = filter;
                    }
                    if(j != 0)
                        System.out.print(" ");
                    System.out.printf("%03d",rgb);
                }
                System.out.println();
            }
            
        }
    }
    //solution two
    class solution{
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] s = br.readLine().split(" ");
            int M = Integer.parseInt(s[0]), N = Integer.parseInt(s[1]),
                    A = Integer.parseInt(s[2]), B = Integer.parseInt(s[3]),
                    filter = Integer.parseInt(s[4]);
            for(int i = 0; i < M; i++) {
                String[] sp = br.readLine().split(" ");
                for(int j = 0; j < N; j++) {
                    int rgb = Integer.parseInt(sp[j]);
                    if(rgb >= A && rgb <= B) {
                        rgb = filter;
                    }
                    if(j != 0)
                        System.out.print(" ");
                    System.out.printf("%03d",rgb);
                }
                System.out.println();
            }
        }
    }
    阅读全文>>

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

2018-09-09

1039. 到底买不买(20)-浙大PAT乙级真题java实现

    1039. 到底买不买(20) 
    小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色.例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。 
    这里写图片描述 
    输入格式: 
    每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。 
    输出格式: 
    如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。 
    输入样例1: 
    ppRYYGrrYBR2258 
    YrR8RrY 
    输出样例1: 
    Yes 8 
    输入样例2: 
    ppRYYGrrYB225 
    YrR8RrY 
    输出样例2: 
    No 2


    阅读全文>>

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

2018-01-23

25.复杂链表的复制

    25.复杂链表的复制

    题目描述

    输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    解题思路:

    1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;

    2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;

    3、拆分链表,将链表拆分为原链表和复制后的链表
     


    public class RandomListNode {
        int label;
        RandomListNode next = null;
        RandomListNode random = null;

        RandomListNode(int label) {
            this.label = label;
        }
    }


    public class Solution {
        public RandomListNode Clone(RandomListNode pHead)
        {
            if(pHead == null)
                return pHead;
            
            //Clone RandomListNode
            RandomListNode pNode = pHead;
            while(pNode != null){
                RandomListNode pCloned = new RandomListNode(pNode.label);
                pCloned.next = pNode.next;
                pCloned.random = null;
                
                pNode.next = pCloned;
                pNode = pCloned.next;
            }
            
            //
            pNode = pHead;
            while(pNode != null){
                RandomListNode pCloned = pNode.next;
                if(pNode.random != null)
                    pCloned.random = pNode.random.next;
                pNode = pCloned.next;
            }
            
            //seperate two list
            pNode = pHead;
            RandomListNode pClonedHead = null;
            RandomListNode pCloned = null;
            if(pNode != null){
                pClonedHead = pCloned = pNode.next;
                pNode.next = pCloned.next;
                pNode = pNode.next;
            }
            while(pNode != null){
                pCloned.next = pNode.next;
                pCloned = pCloned.next;
                pNode.next = pCloned.next;
                pNode = pNode.next;
            }
            return pClonedHead;
        }   
    }

    阅读全文>>

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

2018-08-22

拥抱失败比战胜困难更可贵

    今天看了《跟着贝尔去冒险》,感触很深,所以想把自己的感悟写下来,留作纪念。

    第一,跳出自己的safety zone,勇于尝试和挑战不同的事物;第二,拥抱失败,此时的拥抱失败并不是说,你安于现状不思进取,而是一种心态,拥抱失败之后更能克服自己在这方面的不足。

    在这个富有挑战的社会里,人们一直倡导要付出巨大的努力战胜困难取得成功。当然,当你付出足够多的努力和尝试,最终你真的会取得自己想要的成绩,也可以获得从未有过的高度和自豪感,这种喜悦和快乐是无与伦比的,也是大家都崇尚的。可是人们忽略了一点,有些时候,机会只有一次,在机会来临的时候你自身还不足以胜任所面临的挑战,而现实条件又不允许你有够足够多的尝试,不允许你有足够多的练习去取得你想达到的高度,而此时你还要硬着头皮去做目前这项挑战,迎接你的肯定是失败,这是毫无疑问的。你看着前面很多人都可以轻而易举而完成的任务,即使对于一个女生来说也不费吹灰之力,可对你来说,可能就特别的困难,以你此时的水平和条件去完成这项任务几乎是不可能的,然后你失败了。你觉得很丢人,你觉得无地自容,为什么大家都能轻而易举完成的,你却做的那么糟糕?就像《跟着贝尔去冒险》里的小白,他第一次尝试仅仅借助一根绳索越过下面是水流湍急的瀑布时,由于平衡性不好,他从绳子上掉下来了,但是此时他并没有放弃,还是挣扎了很久,没有回归原位,还是以失败告终。

    他觉得自己可以完成这个任务,可是贝尔不给他第二次机会,因为每个人都仅有一次机会。然而小白觉得很委屈,于是自己一个人贸然的穿过了瀑布,走到了原来出发的那一边,贝尔觉得小伙子很有骨气,决定再给他一次机会。这次,小白太想完成这个任务了,由于紧张和着急,他还是从绳索上掉了下来。但是他还是没有放弃,还是想重新跃到绳索上,一次,两次,三次,……,到第七次由于筋疲力尽他还是松了手,第二次让缆绳把自己运送到了瀑布的对岸。看着自己队友的一个女生都可以完成的任务,自己却两次都失败了,他觉得很委屈,默默地落下了眼泪。

    我很敬重小白,他真的在尝试的过程中使出了自己所有的能力,虽然他在前面所有的挑战中都完成的特别好,唯独这一个任务以失败告终,但是他承受失败的能力着实让人敬佩。

    其实在这个文明社会上,我们每个人都有每个人的优点和短板,有的人天生平衡性好,有的人天生体力好,有的人天生恐高,有的人天生怕水,有的人天生既平衡性好又体力好…… 当在先天因素起决定性因素的场合,有些人不费吹灰之力完成的事儿,对另一类人来说,可能废了九牛二虎之力还是以失败告终。由于自尊心和荣辱感在作怪,你可能感到丢脸、挫败感、无地自容、委屈、心里落差…… 此时的你感到无比的气馁和丧气,觉得自己怎么那么不如别人。其实每个人都有每个人的特点,有的人平衡性差可是唱歌好听又有幽默感,有的人天生怕水可是绘画和弹钢琴是别人可望不可即的,有的人逻辑思维很强可是不懂天文气象学,我们没必要拿自己的劣势和别人的优势做比较。但是我想说,只要你在跳出自己的safety zone的过程中努力了,付出了,勇于尝试了,你就是最棒的。不要只是拿自己的先天短板和别人的长处做对比。拥抱失败,享受过程。拥抱失败比战胜困难更重要,此时所需的心里承受能力是别有一番滋味在心头的,是你内心强大的逆商的体现。你战胜困难的劲儿决定了你事业的高度,但是你承受失败的能力才决定你事业的广度和长度。

     

    拥抱失败,并不等于你安于现状不思进取,而是一种心态,拥抱失败之后更能克服自己在这方面的不足。有些人天生平衡性和体力不好,比如说小白,当有外界刺激激励到他时,他肯定不会让自己的平衡力和体力一直处于这种劣势当中,肯定会通过自己的努力去改善、去锻炼,从而达到一种可能连天生体力好的人都无法达到的高度,这就是拥抱失败,这就是刻意进取,这才是最大的收获。在这个过程中,承受自己第一次遇到失败的挫败感,可能比在努力使自己变好的过程付出的艰辛努力更需要勇气和胆量。

    世界上并非只有智商和情商,只拥有Higher智商和情商的人,取得不了大成功,拥有Higher智商、情商和逆商的人,才是时代的引领者,才是世界的开路人。拥抱失败需要更大的勇气,战胜困难只是成功的微不足道的一步,拥抱失败才是一个人高逆商的体现,才是一种更博大的胸怀和勇气。

    阅读全文>>

作者:Jason分类:【逆商浏览(368评论(0

2018-04-07

1057.数零壹(20)--PAT乙级真题java实现

    1057.数零壹(20)–PAT乙级真题java实现

    给定一串长度不超过10^5的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0、多少1。例如给定字符串“PAT (Basic)”,其字母序号之和为:16+1+20+2+1+19+9+3=71,而71的二进制是1000111,即有3个0、4个1。

    输入格式:

    输入在一行中给出长度不超过105、以回车结束的字符串。

    输出格式:

    在一行中先后输出0的个数和1的个数,其间以空格分隔。

    输入样例:

    PAT (Basic)

    输出样例:

    3 4

     
    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().toLowerCase();
     
            int sum = 0;
            char[] chs = s.toCharArray();
            for(int i = 0; i < chs.length; i++) {
                if(chs[i] >= 'a' && chs[i] <= 'z') {
                    sum += chs[i] - 'a' + 1;
                }
            }
            int one = 0, zero = 0;
            while(sum != 0) {
                if(sum % 2 == 0)
                    zero++;
                else
                    one++;
                sum = sum / 2;
            }
            System.out.println(zero + " " + one);
        }
    }
    阅读全文>>

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

2018-09-08

1010. 一元多项式求导 (25)-浙大PAT乙级真题java实现

    1010. 一元多项式求导 (25)
    设计函数求一元多项式的导数。(注:x^n(n为整数)的一阶导数为n*x^(n-1)。)
    输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
    输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
    输入样例:
    3 4 -5 2 6 1 -2 0
    输出样例:
    12 3 -10 1 6 0

    注意:记得考虑没有输入的情况。以及,输入的只是常数项的情况。这个时候是要输出”0 0″的。


    阅读全文>>

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

2018-01-04