ARTS第三周(2018-12-16)

极客时间《左耳听风》发起的ARTS挑战怎么参加?
左耳朵耗子专栏《左耳听风》 用户自发每周完成一个ARTS
非常抱歉,上周因为事情比较多,一直在加班,没来及做,争取补上
感谢耗子叔上次指出的问题

1.Algorithm:每周至少做一个 leetcode 的算法题

第一道算法题:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

3.无重复字符的最长子串

自己看完题后的思路:
第一种,将所有的子串找出,然后筛选出无重复字符的,然后再对比长度
第二种,

字符串:ABCDECDEFGIF
A
AB
ABC
ABCD
ABCDE
ABCDEC  => ABCDE DEC  maxLength = 5;
DECD    => DEC ECD    maxLength = 5;
ECDE    => ECD CDE    maxLength = 5;
CDEF    
CDEFG
CDEFGI
CDEFGIF =>CDEFGI GIF  maxLength = 6; 

最开始的代码:

public int lengthOfLongestSubstring(String s) {
        if(s.length()<=1){
            return s.length();
        }
        int maxLength = 0;
        Set<Character> set = new LinkedHashSet();
        Set<Character> tmpSet;
        int length = s.length();
        Boolean isEqual;
        for (int index =0 ;index<length;index++) {
            char c = s.charAt(index);
            if(!set.add(c)){
                maxLength = Math.max(maxLength,set.size());
                tmpSet = new LinkedHashSet();
                isEqual = false;
                for(char ch : set ){
                    if(ch==c){
                        isEqual = true;
                        continue;
                    }
                    if(isEqual){
                        tmpSet.add(ch);
                    }
                }
                tmpSet.add(c);
                set = tmpSet;
            }
        }
        maxLength = Math.max(maxLength,set.size());
        return maxLength;
    }

再细想一下,可以采用滑动窗口的方式:

/**
 * 滑动窗口方式:
 * [leftIndex,rightIndex]
 * 开始leftIndex不动,rightIndex往右移动,并将值添加到set中。
 * 如果添加成功,次数计算 Math.max(maxLength,rightIndex-leftIndex),(注意:此时的rightIndex已经++)。
 * 如果添加失败,说明已经存在,从leftIndex开始移除,直到添加再次成功,说明set重复值之前的数据已经全部删除。
 */
 public int lengthOfLongestSubstring1(String s) {
    int maxLength = 0;
    Set<Character> set = new HashSet();
    int length = s.length();
    for (int leftIndex = 0, rightIndex = 0 ;rightIndex< length && leftIndex<length;){//此处可以换成while
        if(set.add(s.charAt(rightIndex))){
            rightIndex++;
            maxLength = Math.max(maxLength,rightIndex-leftIndex);
        }else{
            set.remove(s.charAt(leftIndex++));
        }
    }
    return maxLength;
}

第二道算法题:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

4.寻找两个有序数组的中位数

思路:将两个数组合并排序,到一半结束
问题:时间复杂度不是题目要求的 O(log(m + n))

/**
 * 支持 ,两个都是正序,两个都是倒序,或者一个正序一个倒序
 * @param nums1
 * @param nums2
 * @return
 */
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    double result= 0d;
    if(nums1==null){
        nums1 = new int[]{};
    }
    if(nums2==null){
        nums2 = new int[]{};
    }
    if(nums1.length==0 && nums2.length==0){ // 处理两个都是0的情况
        return result;
    }

    // 奇数/偶数  是否是奇数
    boolean isOdd = (nums1.length+nums2.length)%2 !=0;
    int medianIndex1 = isOdd ? (nums1.length+nums2.length)/2 : (nums1.length+nums2.length)/2 -1;
    int medianIndex2 = isOdd ? -1 : (nums1.length+nums2.length)/2;

    int[] nums3 = new int[isOdd ? medianIndex1+1 :medianIndex2+1];
    // 倒序,正序??
    boolean nums1Asc = true;
    boolean nums2Asc = true;

    for(int i=0 ;i<nums1.length-1;i++){
        if(nums1[i]!=nums1[i+1]){
            nums1Asc = nums1[i] < nums1[i+1];
            break;
        }
    }
    for(int i=0 ;i<nums2.length-1;i++){
        if(nums2[i]!=nums2[i+1]){
            nums2Asc = nums2[i] < nums2[i+1];
            break;
        }
    }
    int i = nums1Asc ? 0 : nums1.length-1;
    int j = nums2Asc ? 0 : nums2.length-1;;
    int index =0;
    while ((nums1Asc ? i<nums1.length : i>=0) || (nums2Asc ? j<nums2.length : j>=0)){
        if((nums1Asc ? i<nums1.length : i>=0) && (nums2Asc ? j<nums2.length : j>=0)){
            if(nums1[i]<nums2[j]){
                nums3[index] = nums1[i];
                i = nums1Asc ? i+1 : i-1;
            }else{
                nums3[index] = nums2[j];
                j = nums2Asc ? j+1 : j-1;
            }
        }else if(nums1Asc ? i<nums1.length : i>0){
            nums3[index] = nums1[i];
            i = nums1Asc ? i+1 : i-1;
        }else if(nums2Asc ? j<nums2.length : j>0){
            nums3[index] = nums2[j];
            j = nums2Asc ? j+1 : j-1;
        }
        if(isOdd ){
            if(index == medianIndex1){
                break;
            }
        }else{
            if(index == medianIndex2){
                break;
            }
        }
        index++;
    }

    if(isOdd ){
        result = (double)nums3[nums3.length-1];
    }else{
        result = ((double)nums3[nums3.length-1]+(double)nums3[nums3.length-2])/2;
    }
    return result;
}

2.Review:阅读并点评至少一篇英文技术文章

How to think like a programmer — lessons in problem solving

如何像程序员一样思考问题-解决问题的经验教训

从本质上讲, 这是解决问题的一种更有效的方法

一般解决问题的方式:

  1. 尝试一个方案
  2. 如果方案不成功,尝试另一个方案
  3. 如果还不起作用,重复步骤2,直到解决

运气好可以解决,运气不好,可能浪费很多时间也没有解决

推荐的方法:

  1. 首先得有一个框架
  2. 多实践
Almost all employers prioritize problem-solving skills first.
Problem-solving skills are almost unanimously the most important qualification that employers look for….more than programming languages proficiency, debugging, and system design.

几乎所有雇主都首先优先考虑解决问题的技能。
解决问题的技能几乎是雇主寻求的最重要的资格...不仅仅是编程语言的熟练程度,调试和系统设计

一、框架
作者建议:"The 4-Hour Chef"

“The biggest mistake I see new programmers make is focusing on learning syntax instead of learning how to solve problems.” — V. Anton Spraul

我看到新程序员犯下的最大错误就是专注于学习语法,而不是学习如何解决问题。

遇到新问题时应该怎么做?

  1. 理解
    首先你的理解问题,才能很好的解决问题。
    怎么算理解呢?引用一下:
“If you can’t explain something in simple terms, you don’t understand it.” — Richard Feynman

如果你不能用简短的文字描述一件事情,那么不算理解它。

  1. 制定计划

处理问题是一定要花时间先去理解问题,分析问题,然后制定执行计划。有了计划再去执行。

  1. 拆解问题

不要试图去一下解决一个大问题。
应该将大问题拆解成一个个的小问题,甚至可以把小问题继续拆解。
然后,从解决拆解后的小问题开始处理。
当所有小问题解决后,把小问题串联起来,大问题自然就解决了。

将问题减少到知道如何解决问题并编写解决方案的程度。

二、坚持了吗?

解决小问题试,遇到问题,卡住了,怎么办?

  1. 调试
  2. 重新评估,是不是换另一中思路(有时我们会在问题的细节上迷失方向,而忽略了在更一般的层面上解决问题的一般原则)
  3. 研究,比如,谷歌等

三、实践

不要期望短时间内就会有一个很好的改变。
如果你想成为一个好的问题解决者,你需要不断的去解决问题。
当然,解决的问题有很多:国际象棋谜题,数学问题,数独,围棋,大富翁,视频游戏,密码等等

事实上,成功人士的共同模式是他们练习“解决微观问题”的习惯。

3.Tip:学习至少一个技术技巧

uptime

11:07  up 5 days, 19:58, 5 users, load averages: 2.90 2.96 2.76

显示内容说明:

11:07   # 系统当前时间
up 5 days, 19:58   # 系统已运行时间
5 users  # 登录用户数
load averages: 2.90 2.96 2.76  # 系统平均负载,统计最近1,5,15分钟的系统平均负载

平均负载:是指单位时间内,系统处于可运行状态下和不可中断状态的平均进程数,也就是平均活跃进程数,它和CPU使用率没有直接关系。

4.Share:分享一篇有观点和思考的技术文章

创业公司需要基础架构团队吗?

个人刚经历的一个创业公司,公司成立已经快一年了,有一个后台的统计程序,所有逻辑全部用sql写到了controller中。
因为之前没经历过创业公司,所以不清楚这样做是不是对。
欢迎同学给建议。

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

推荐阅读更多精彩内容