美文网首页
ARTS第三周(2018-12-16)

ARTS第三周(2018-12-16)

作者: 无名GOD | 来源:发表于2018-12-16 11:14 被阅读0次
极客时间《左耳听风》发起的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中。
因为之前没经历过创业公司,所以不清楚这样做是不是对。
欢迎同学给建议。

相关文章

  • ARTS第三周(2018-12-16)

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

  • ARTS打卡第三周

    ARTS打卡第三周 Algorithm:每周至少做一个 leetcode 的算法题 839. 相似字符串组 解题思...

  • ARTS第三周

    Algorithm leetCode 60 Permutation SequenceGiven n and k, ...

  • 第三周ARTS

    Algorithmic 用链表将两数相加,之后输出和。https://leetcode-cn.com/proble...

  • ARTS第三周

    Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再...

  • ARTS第三周

    1.Algorithm:只出现一次的数字 2.Review:在shell中键入命令都发生了什么? 3.Tip:自动...

  • 【009】——语言美学坚持星球第二期声音训练营·第三周复盘

    2018-12-16,周日,天气晴,轻霾 光阴如梭,转眼就结束了第三周的学习,马上就进入到实战篇了,到了检验阶段性...

  • ARTS打卡,第三周

    每周完成一个ARTS:1.A(Algorithm)每周至少做一个 leetcode 的算法题2.R(Review)...

  • ARTS打卡第三周

    Algorithm Review 个人语音计算平台想让类airpods产品成为一个突破性的个人计算平台(就像sma...

  • ARTS挑战-第三周

    Algorithm Review Improving Immutable Object Initializatio...

网友评论

      本文标题:ARTS第三周(2018-12-16)

      本文链接:https://www.haomeiwen.com/subject/qgbtkqtx.html