ARTS第四周

补第四周

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

以下是各项的情况:

Algorithm

链接:[LeetCode-13]-Roman to Integer

罗马数字 I V L C D M
相应的阿拉伯数字表示为 1 5  10 50 100 500 1000

总结 :

1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;

2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;

3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,且放在大数的左边只能用一个。如:Ⅳ= 4;Ⅸ= 9;

4、正常使用时,连写的数字重复不得超过三次。

5、L 和C 左边的小数字只能用X。

6、D 和M 左边的小数字只能用C。

没有让我们来验证输入字符串是不是罗马数字这点很赞,不然得考虑用正则或者写判断条件判断下 要写很长。 那么 假定 输入的绝对是罗马数字,那么要将题转换成 :

输入罗马数字 转换成对应整数值,同时

1.如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字。

2. 其他情况则减去这个数字。

要将罗马数字和相应整数值对应 那么使用map结构进行对应 , 应该会是一个可行的方案 。

/*   记录对应数组
String[] num1 = {“I”,”II”,”III”,”IV”,”V”,”VI”,”VII”,”VIII”,”IX”};
String[] num10 = {“X”, “XX”,”XXX”,”XL”,”L”,”LX”,”LXX”,”LXXX”,”XC”};
String[] num100 = {“C”,”CC”,”CCC”,”CD”,”D”,”DC”,”DCC”,”DCCC”,”CM”};
String[] num1000 = {“M”,”MM”,”MMM”};
 */

class Solution {

    public int romanToInt(String s) {
        int sum = 0;
        if(s.indexOf("IV")!=-1)  sum-=2;
        if(s.indexOf("IX")!=-1)  sum-=2;
        if (s.indexOf("XL") != -1) sum -= 20;
        if (s.indexOf("XC") != -1) sum -= 20;
        if (s.indexOf("CD") != -1) sum -= 200;
        if (s.indexOf("CM") != -1) sum -= 200;
         char[] c = s.toCharArray();
        for(int i = 0; i < c.length; i++) {
            if (c[i] == ‘I‘) sum += 1;
            if (c[i] == ‘V‘) sum += 5;
            if (c[i] == ‘X‘) sum += 10;
            if (c[i] == ‘L‘) sum += 50;
            if (c[i] == ‘C‘) sum += 100;
            if (c[i] == ‘D‘) sum += 500;
            if (c[i] == ‘M‘) sum += 1000;
        }
        return sum;

    }
}

Review

分享   设计模式:工厂模式

工厂是每个开发人员应该知道的关键创建模式之一。

4种工厂模式:

  • 工厂(factory)方法模式
  • 抽象(abstract)工厂模式
  • 静态(static)工厂方法
  • 简单(simple)工厂(也称为工厂)。

此外最关键的 作者提出不要滥用 工厂模式 ,只有在对于涉及使用相同代码的多个开发人员的大中型项目推荐使用  , 他会在以下情况内推荐避免使用:

  • 当我在家里/工作单独编码时,避免使用。
  • 对于不会改变很多的小项目,也避免使用。

工厂模式的优势是代码的可读性理解之间的权衡!


工厂模式用来创建objects, 不过为什么不直接用构造函数调用创建objets 作者也有讲到,很细心。

两个优点是工厂模式在复杂的使用中 抛弃了直接用构造函数 :

 1. 控制实例化

  限制类的实例数 比如 : 将如何设置只有一个(或2个或10个)类的实例,特别是它使用类似套接字,或者数据库连接或文件系统描述符等资源。

这种情况下,使用构造函数方法,不同的函数(来自不同的类)很难知道类的实例是否已经存在。 而使用一个静态工厂方法 ,相对于构造函数方法 就轻松了很多

public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   private Singleton(){}

   public static Singleton getInstance(){
      return INSTANCE;
   }
...
}
...
public class ClassXXX{
   ...
   public static void someFunctionInClassXXX(){
      Singleton instance = Singleton.getInstance();
      //some stuff
   }
}
...

public class ClassYYY{
   ...
   public static void someFunctionInClassYYY(){
      Singleton instance = Singleton.getInstance();
      //some stuff
   }
}

我们使用的工厂将Singleton类的实例数限制为一个。

注意:我们可以修改实例的创建方式(例如,通过使用原型模式而不是每次从头开始创建新对象),而不是限制实例的数量。

 2. 松耦合

比如 ,我们假设您编写了一个计算内容并需要编写日志的程序。由于它是一个很大的项目,你的代码是在编写业务类时将日志写入文件系统(类FileSystemLogger)的类。没有工厂,您需要在使用之前使用构造函数实现FileSystemLogger:

public class FileSystemLogger {
   ...
   public void writeLog(String s) {
   //Implemation
   }
}
...
public void someFunctionInClassXXX(some parameters){
   FileSystemLogger logger= new FileSystemLogger(some paramters);
   logger.writeLog("This is a log");
}

但是如果突然发生变化并且您现在需要使用实现DatabaseLogger在数据库中写入日志会发生什么?没有工厂,您将不得不使用FileSystemLogger类修改所有函数。由于此记录器在任何地方都使用,您需要修改数百个函数/类,而使用工厂, 您可以通过仅修改工厂来轻松地从一个实现切换到另一个实现

//this is an abstraction of a Logger
public interface ILogger {
   public void writeLog(String s);
}

public class FileSystemLogger implements ILogger {
   ...
   public void writeLog(String s) {
      //Implemation
   }
}

public class DatabaseLogger implements ILogger {
   ...
   public void writeLog(String s) {
      //Implemation
   }
}

public class FactoryLogger {
   public static ILogger createLogger() {
      //you can choose the logger you want
      // as long as it‘s an ILogger
      return new FileSystemLogger();
   }
}
////////////////////some code using the factory
public class SomeClass {
   public void someFunction() {
      //if the logger implementation changes
      //you have nothing to change in this code
      ILogger logger = FactoryLogger.createLogger();
      logger.writeLog("This is a log");
   }
}

可以轻松地将Logger实现从FileSystemLogger更改为DatabaseLogger。您只需要修改createLogger()函数(这是一个工厂)。此更改对于客户端(业务)代码是不可见的,因为客户端代码使用logger(ILogger)的接口。

3 . 封装 (具体见文章里的)

4.  消歧 (具体见文章里的)

静态工厂:

Joshua Bloch在“Effective Java”中描述了静态工厂方法:

“类可以提供一个公共静态工厂方法,它只是一个返回类实例的静态方法。”

真实的例子

以下是Java框架和Java API中的静态工厂方法的一些示例。由于Joshua Bloch是许多Java API的主要架构师,所以在Java API中查找示例非常简单。

记录框架

java日志框架slf4j,logback和log4j使用抽象类LoggerFactory。如果开发人员想要编写日志,他需要从LoggerFactory的静态方法getLogger()获取Logger实例。
getLogger()返回的Logger实现将取决于getLogger()实现(以及getLogger()使用的开发人员编写的配置文件)。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 public class Example{

   public void example() {
   //we‘re using the static factory method to get our logger
   Logger logger = LoggerFactory.getLogger(Example.class);

   logger.info("This is an example.");
   }

 }

简单的工厂

Tip

  MySQL查询流程

  只有查询优化,索引优化,库表结构优化都进行时,才能实现MySQL高性能 。真正重要的是响应时间。

  查询主流程:

  

  1. 客户端发送一条查询给服务器

  2. 服务器先检查查询缓存,如果命中缓存,立刻返回存储在缓存中的结果,否则进入下一阶段

  3. 服务器进行SQL解析,预处理,再由优化器生成对应的执行计划,

  4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询

  5. 将结果返回客户端

 MYSQL连接状态:

  对于一个MYSQL连接,或者说一个线程,任何时刻都有一个状态,代表MYSQL在做什么

  最简单查看状态方式命令是使用show full processlist

  在一个查询周期中,状态可能会改变多次

  这些状态有:

    sleep:

    线程正在等待客户端发送新的请求

    query:

    线程正在执行查询或者正在将结果发送给客户端

    

    locked:

    在MYSQL服务器层,该线程正在等待表锁。在存储引擎级别实现的锁,

    例如innoDB的行锁,并不会体现在线程状态中。对于myisam来说这是一个比较典型的状态,其他没有

    行锁的引擎也会经常出现

    

    analyzing and statistics:

    线程正在收集存储引擎的统计信息,并生成查询的执行计划。

    copying to tmp table[on disk] :

    线程正在执行查询,并且将结果复制到一个临时表 , 这种状态一般要么是在做group by 操作, 要么是文件排序操作,或者是union操作

    如果这个状态后有on disk 标记,那表示MYSQL正在将一个内存临时表放在磁盘上

    sorting result:

    线程正在对结果集进行排序

    sending data:

    这表示多种情况,线程可能在多个状态之间传送数据,或者在生成结果集,或者在客户端发送请求

    

Share

  这周推荐一篇观点,是关于性玩具应用程序现在可以计算卡路里,应该反对的 , 比较有趣 。果然不管国内外 , 科技是第一生产力 , 性是第二生产力啊 。。。 大意就是  飞机杯或者自慰器 有应用程序去监控消耗了多少的卡路里,甚至有厂商用智能手表  去监控 你啪啪啪的程度 , 有教程推送 来教你 , 来让你达到一个标准让双方满足  ???? 以此来达到健身的效果。。。真是黑科技。。。将性产品转换为了健康运动制度的一部分进行营销 。。。

   不过 我和作者观点一致 不只是由于尴尬 , 其实这也是一种侵犯隐私的方式 。 如果是国内 还会记录数据 加入大数据里 进行分析 , 来达到购买推荐和相亲的推荐吧 ??  这其实并不好 。是一件无语的创新。

https://sextechguide.com/opinion/sex-toy-apps-can-now-count-calories-really-shouldnt/

原文地址:https://www.cnblogs.com/jxl00125/p/11173025.html

时间: 2024-08-01 11:21:28

ARTS第四周的相关文章

ARTS第四周打卡

1.Algorithm 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 2.Review https://mp.weixin.qq.com/s/Wo61D8yzoOx-rpvCmlSyxg 主要讲解InnoDB下索引的数据结构,索引如何起作用的,如何更好的利用索引提高效率. 3.Tips 搭建dubbo服务将多个项目公共

ARTS打卡计划第四周-ALGORITHM

866. 回文素数 求出大于或等于 N 的最小回文素数. 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数. 例如,2,3,5,7,11 以及 13 是素数. 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数. 例如,12321 是回文数. package com711; import java.util.ArrayList; import java.util.Collections; import java.util.List; public c

ARTS打卡计划第四周-Review-构建大规模django应用的一些建议

本周文章来源于https://medium.com/@DoorDash/tips-for-building-high-quality-django-apps-at-scale-a5a25917b2b5,这篇文章还是非常难阅读的.但是其中提到了一些django的实践还是很有借鉴意义. 文章中主要有如下观点 1.非常小心的设计你的apps 如果你不明白如何去设计多个app,你可以保持只有一个app.如果你一定要分成多个app,你必须明确减少他们的依赖.app之间的依赖越少,每个app越容易打成一个微

ARTS打卡计划第四周

Algorithms: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 采用了map的存储,然后移动窗口方式解决此问题,当然看到有个动态规划,一直很难理解. Review: https://www.infoq.cn/article/rAJiubRpi9xSl_LEhI2N 友谊与程序,生活与事业. Tips: c++11 : 1.右值引用 是对临时对象的一种引用,它是在初始化时完成引

ARTS打卡计划第十四周

Algorithms: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ Review: “How to write a good software design doc” by Angela Zhang https://medium.com/p/66fcf019569c Tips: android log 分类. kernel.radio.event.main这四种log.目前主要用了kernel 和event

第四周作业

第四周作业 1.复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. (1)复制/etc/skel目录为/home/tuser1 [[email protected] ~]# cp -r /etc/skel/ /home [[email protected] ~]# mv /home/skel /home/tuser1 [[email protected] ~]# ll -a /home/tuser1/ total 2

#51CTO学院四周年#详解JWT的结构与应用

1. JWT是什么? JWT,全称JSON WEB TOKEN, 是WEB客户端与服务器之间相互进行安全通信的规范.通信双方的对象本身通过JSON传递数据是不安全的,但是由于有了数字签名的存在,这些信息变的可信的. 2. JWT特点 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库 3. JWT的应用场景 身份认证:当用户在客户端完成

51CTO四周年——米的感悟

不知不觉,我已经来到这里一年多了,2016年4月4号,我偶然发现了这个网站,当时刚学完思科的四门基础课程,对网络很感兴趣,想要一直从事这个行业,于是我找到老师,说明了自己的想法,老师鼓励我去考CCNA认证,我觉得是一个很好的锻炼机会和学习机会,就四下寻找资源. 在找到这个网站,准确的说,是找到晁海江老师的课程之后,我内心狂喜,仔细研究了一遍课程大纲后,试听下来,觉得晁老师讲的很不错,我也喜欢听他的声音,所以就购买了全套课程.从那以后,我冲着考CCNA这个目标,十分刻苦努力地学习起来,每一天都有期

第十四周学习进度

时间 十四周 学习时间 78小时 代码量 1623行 所学知识 临近期末,学习任务越来越重,用在专业技术学习上的时间相对减少了很多.不过这周还是有些收获的.首先是数据结构作业的完成,我头一次使用Qt写了一个图形界面.以前我学习Qt是总觉得它晦涩难懂,但是这次我只是看了看学习视频,觉得容易多了.虽然当下图形界面不是很热门,但是学了两年的计算机,连一个图形界面都写不出来还是很尴尬的,所以以后若是有时间还是应该好好学学.