ARTS第十周

ARTS第十周

ARTS是什么?

Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。

Algorithm

题目:20. Valid Parentheses

解题思路

1.根据题意需要进行括号配对,当遇到左括号的时候需要存起来,以便遇到右括号的时候去取出来进行配对;当遇到右括号的时候就直接去和保存的左括号进行配对。
2.根据配对的特性我们采用栈这种数据结构来保存左括号。
3.因为存在多组括号()、[]、{},所有需要用一个map来保存每组括号的对应关系。因为我们会根据右括号去取左括号,所以以右括号为key,左括号为value放入map。

代码

public boolean isValid(String s) {
         //定义好括号
        Map<Character, Character> parentheses = new HashMap<>();
        parentheses.put('}', '{');
        parentheses.put(']', '[');
        parentheses.put(')', '(');

        //保存左括号的栈
        Stack stack = new Stack();
        for (char c : s.toCharArray()) {
            //如果是右括号,去栈中弹出一个元素做比较
            if (!parentheses.containsKey(c)) {
                stack.push(c);
            } else if (stack.empty() || !stack.pop().equals(parentheses.get(c))) {
                //如果是左括号,压入栈中
                return false;
            }
        }
        return stack.isEmpty();
    }

Review

java并发同步工具之CountDownLatch

CountDownLatch是一个并发同步工具,它允许一个或多个线程等待一组操作完成。

CountDownLatch可以使用参数count初始化。wait方法会阻塞直到当前count变为0通过调用countDown方法,在那之后,所有等待的线程被释放,await之后的调用立即返回。这是一次性现象,即count不能被重置。如果你需要count可重置的版本,考虑使用CyclicBarrier。

CountDownLatch是一个多功能同步工具,能被用于多种用途。一个被初始化为count=1的CountDownLatch可以用作简单的开关或门:所有调用await方法的线程等待在门口直到它被一个调用countDown的线程打开为止。被初始化为count=N的CountDownLatch能使一个线程等待其他N个线程完成一些动作或者一些动作完成N次。

CountDownLatch一个有用的属性是它不要求调用countDown的线程等待count变为0,它只阻止调用了await方法的线程等待直到所有线程通过。

例子:这里是一对类,其中一组worker线程使用两个countdown latches:

  • 第一个是一个开始信号,它阻止worker执行直到dirver准备好让他们继续执行。
  • 第二个是一个完成信号,它允许driver等待所有worker工作完成。
 class Driver { // ...
   void main() throws InterruptedException {
     CountDownLatch startSignal = new CountDownLatch(1);
     CountDownLatch doneSignal = new CountDownLatch(N);

     for (int i = 0; i < N; ++i) // create and start threads
       new Thread(new Worker(startSignal, doneSignal)).start();

     doSomethingElse();            // don't let run yet
     startSignal.countDown();      // let all threads proceed
     doSomethingElse();
     doneSignal.await();           // wait for all to finish
   }
 }

 class Worker implements Runnable {
   private final CountDownLatch startSignal;
   private final CountDownLatch doneSignal;
   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
     this.startSignal = startSignal;
     this.doneSignal = doneSignal;
   }
   public void run() {
     try {
       startSignal.await();
       doWork();
       doneSignal.countDown();
     } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

另一个典型的应用是分割一个问题为N个部分,用Runnable描述每个部分,执行该部分并对latch进行count down,并将所有Runnables排队到Executor,当所有子部分完成的时候,协调线程也将继续执行下去。

class Driver2 { // ...
   void main() throws InterruptedException {
     CountDownLatch doneSignal = new CountDownLatch(N);
     Executor e = ...

     for (int i = 0; i < N; ++i) // create and start threads
       e.execute(new WorkerRunnable(doneSignal, i));

     doneSignal.await();           // wait for all to finish
   }
 }

 class WorkerRunnable implements Runnable {
   private final CountDownLatch doneSignal;
   private final int i;
   WorkerRunnable(CountDownLatch doneSignal, int i) {
     this.doneSignal = doneSignal;
     this.i = i;
   }
   public void run() {
     try {
       doWork(i);
       doneSignal.countDown();
     } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

Tip/Techni

本周实践了一种设计模式"装饰器"模式,装饰器模式通常为了在不改变原有类的基础上增加新的功能(增加新的装饰器类),此装饰类主要有三个重点:

  • 装饰类和原有类实现同一个接口
  • 装饰类持有一个原有类的对象,在实现方法中调用原有类的方法
  • 客户端生成一个装饰类对象,调用原接口方法实现新的功能

Share

原文在这里Don’t learn a programming language, solve a problem instead

从文章标题就可以看出文章大意:不要只学习编程语言,而要学习解决问题。对这篇文章感兴趣的同学可以去读一下原文,个人工作几年之后的感受就是编程语言只是你诸多技能中很小的一个技能,而解决问题的能力才是一个人最重要的能力,也是很考验一个人各方面的综合能力。

技术再好如果无法用来解决实际问题的话也谈不上真的技术好,而且在平时工作中,领导、公司只会看到你解决了哪些问题,为公司做了什么事情,而不会来在意你用了什么技术。

总结:技术是为解决问题服务的,编程语言只是技术中的一部分。在解决问题的过程中积累技术,在积累技术的过程中更好地解决问题。

欢迎有想法的同学一起交流学习^_^

原文地址:https://www.cnblogs.com/muxuanchan/p/10419712.html

时间: 2024-10-06 14:43:26

ARTS第十周的相关文章

第十周周总结

周数 专业学习目标 专业学习时间 新增代码量 人文方面的学习 知识技能总结 第 十 周 数据结构: 树,二叉树 5h 400左右 <只有偏执狂才能生存> 区分树的各种表示法以及树的三种遍历 WEB:事件处理的相关事件 5h 400左右 完成事件处理的键盘鼠标相关事件

20155335俞昆《java程序设计》第十周总结

学号 2016-2017-2 <Java程序设计>第十周学习总结 ## 事实上网络编程,我们可以简单的理解为两台计算机相互通讯数据而已,对于程序员而言,掌握一种编程接口并使用一种编程模型相对而言就简单多了,javaSDK提供了一些相对简单的Api来完成12这些工作,Socket就是其中之一,对于java而言,Api的存在和java.net包里面.因此只要导入这个包就可以准备网络编程了. 客户机到服务机的模型就是网络编程的基本模型,简单的说就是引进这两个进程之间的相互通信,其中一个必须提供固定的

第十周进度条

第十周          日期  星期一   星期二   星期三   星期四   星期五   星期六   星期日  了解到的知识点      

第十周(补)

最近这段时间对自己的学习状态很不满意,上课一直开小差,只好利用课余的时间去和学霸请教了. 周次 学习时间 新编写代码行数 博客量(篇) 学到知识点 第十周 5 120 1 HTML                                                  

学习进度条 第十周

到了发进度条的时候才想起来上周的进度条忘记发了,这周看了孟晨助教的评论,给自己指出了好多问题(虽然有些术语还没接触过),发现自己有一点毛病很明显:写文档的能力太差,写东西比较随意,想到哪写到哪,以后要多向写文档好的同学看齐. 本周末本计划开始冲刺,由于找到的一些可以添加的demo有些问题迟迟没有开始,下周会抓紧开始   第十周 所花时间(H) 10 代码量(行) 2000 博客量(篇) 1 了解到的知识点 安卓开发的一些知识

软件工程_东师站_第十周作业

一.PSP Data Type Job start Int End Total 20160510 助教 团队作业二 20:00 5 21:00 55 20160511 助教 团队作业二.三 18:45 16 20:45 104 20160512 耐撕 站立会议 18:15   18:35 20 二.进度条   代码行数 博客字数 知识点 第一周 400 430 见我博客软件工程——师大站1 第二周 0 5200 见我博客软件工程_东师站_课堂笔记 第三周 0 63 站立会议.单元测试 第四周 1

软件工程进度条-第十周

第十周 所花时间(包括上课) 6 代码量(行) 0 博客量(篇) 1 了解到的知识点 开发中期对软件需求的改进方法.

20145123刘森明《Java程序设计》第十周学习总结

教材学习内容总结 1.网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输2.在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析3.在现有的网络中,网络通讯的方式主要有两种:TCP(传输控制协议)方式UDP(用户数据报协议)方式4.客户端(Client)是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实

第十周学习进度

  第十周 学习时间 15 代码量 300 博客量 1 学习到的知识点 安卓程序的编写,软件用户的需求分析 总结:这周比较轻松,主要是对自己程序后期开发的构想,理念,想法很重要,要符合面对用户的需求,要有自己的特色,这很重要.