补第四周

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/

ARTS第四周的更多相关文章

  1. ARTS打卡第四周

    Algorithm 只出现一次的数字   给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用 ...

  2. ARTS打卡计划第十四周

    Algorithms: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ Review: “How to write ...

  3. 纯css3圆形从中心向四周扩散动画效果

    查看效果:http://hovertree.com/texiao/css3/37/ 先来个简单的示例,例如: @keyframes hovertreemove{from {top:30px;}to { ...

  4. 20169212《Linux内核原理与分析》第四周作业

    Linux第四周作业 1. 堆栈知识 首先回顾了下堆栈相关的知识,堆栈机制是高级语言可以运行的一个基础,这一块需要重点掌握.函数发生调用时,如图 call指令:将eip的按顺序执行的下一条指令(因为在 ...

  5. Surprise团队第四周项目总结

    Surprise团队第四周项目总结 项目进展 这周我们小组的项目在上周的基础上进行了补充,主要注重在注册登录界面的改进优化与美观,以及关于人计算法的学习与初步实现. 我们小组针对上次APP中界面出现的 ...

  6. 20145213《Java程序设计》第四周学习总结

    20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...

  7. 20145304 Java第四周学习报告

    20145304<Java程序设计>第四周学习总结 教材学习内容总结 1.继承共同行为: 继承基本上就是避免多个类间重复定义共同行为,关键词为extends. 代码如下: //继承共同行为 ...

  8. 20145330《Java程序设计》第四周学习总结

    20145330<Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复习前面的,如此巩固也让我对 ...

  9. 20145337《Java程序设计》第四周学习总结

    20145337<Java程序设计>第四周学习总结 教材学习内容总结 继承与多态 继承 继承,避免多个类间重复定义共同行为 符合DRY(Don't Repeat Yourself)原则,多 ...

随机推荐

  1. celery Django 简单示例

    一.目录结构 二.创建worker文件夹 __init__.py # -*- coding:utf-8 -*-import osfrom celery import Celery, platforms ...

  2. Docker学习(8) Docker的CS模式

    Docker的CS模式 链接方式   socket

  3. EyeQ进展The Evolution of EyeQ

    EyeQ进展The Evolution of EyeQ Mobileye's proven leadership in ADAS technologies is based in our EyeQ f ...

  4. 机器学习PAL产品优势

    机器学习PAL产品优势 PAI支持丰富的机器学习算法.一站式的机器学习体验.主流的机器学习框架及可视化的建模方式.本文介绍PAI的产品优势. 丰富的机器学习算法 PAI的算法都经过阿里巴巴集团大规模业 ...

  5. Amazon SageMaker和NVIDIA NGC加速AI和ML工作流

    Amazon SageMaker和NVIDIA NGC加速AI和ML工作流 从自动驾驶汽车到药物发现,人工智能正成为主流,并迅速渗透到每个行业.但是,开发和部署AI应用程序是一项具有挑战性的工作.该过 ...

  6. YOLOv4实用训练实践

    YOLOv4实用训练实践 准备工作 推荐使用Ubuntu 18.04 CMake >= 3.8: https://cmake.org/download/ CUDA >= 10.0: htt ...

  7. Python_Selenium 之PO模式的思想、优化思路

    一.PO模式思想 PO模式是一种自动化测试设计模式,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性. PO设计模式基础(页面作为类.元素对象作为属性.元素操作作为方法) ...

  8. 「10.16晚」序列(....)·购物(性质)·计数题(DP)

    A. 序列 考场不认真读题会死..... 读清题就很简单了,分成若干块,然后块内递增,块外递减,同时使最大的块长为$A$ B. 购物 考场思路太局限了,没有发现性质, 考虑将$a_{i}$,排序前缀和 ...

  9. 如何编写shell脚本

    1.首先创建一个目录 vi hello.sh 2.编写shell第一行 #!/bin/bash    (为了声明是shell脚本,第一行都要这么写) 3.可以添加注释     #the first p ...

  10. Visual Studio 2010下ASPX页面的TreeView控件循环遍历

    如果维护一个老系统就总会遇到各种问题,而这次是TreeView的循环遍历.对于Visual Studio2010上aspx页面的TreeView控件,我感受到了什么叫集微软之大智慧.与二叉树型不一样. ...