0%

2018年4月12日 下午3:54
Jump Game - LeetCode

错误❎

  1. 没有带实际的数去写具体的过程,只是画了个数组,连这个数组中的数理解都是错误的,能写对个屁!
    1. 这里的错是因为自己不踏实。人的脑子有限的,不一步步的具体写你很容易前后步骤混
    2. 还有一招,就是问自己:这个数据代表着啥,能干啥等各种问题,通过问题让自己有思考的时间
  2. 看上去一个复杂的题,最后就变成了一个遍历数组的题。
    1. 只有认识这种我们大一都会的程度,才说明我们理解的很透彻,程序才好写
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      class Solution {
      public:
      bool canJump(std::vector<int>& nums) {
      std::vector<int> index;
      //求出每个点最远到达的位置保存在index[]中
      for(int i = 0; i < nums.size(); i++){
      // index[i] = nums[i]+i;
      index.push_back(nums[i]+i);
      }

      int max_index=index[0];
      //max_index记录最大点,同时用作判断的核心
      for(int i = 1; i < index.size(); i++){
      if(max_index > index[i]){
      return false;
      }

      if(max_index < index[i]){
      max_index = index[i];
      }

      if(i == index.size()-1) return true;
      }
      return false;//随便写,只为不报错
      }
      };

2018年4月11日 下午3:54

题目:

1363 — Rails

解析:

POJ1363 Rails【stack】【栈】 - CSDN博客

坑:

  1. 一边放入一边判断那里我们有真实的去在纸上模拟各种情况,只是知道个大概,然后就动手做。
  2. 由于没有仔细的认真的分析,最后遇到问题也不停下来分析
  3. 总之,急于求成!!!!不踏实
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <stdio.h>
    #include <stack>
    #include <queue>

    int main(){
    int n = 0;
    int num;

    scanf("%d",&n);
    while(n){
    scanf("%d",&num);
    while(num != 0){
    //初始化
    std::stack<int> S;
    std::queue<int> Q;

    Q.push(num);
    //放到Q中
    for(int i = 2; i <= n ;i++){//第一个已经方进入了
    scanf("%d",&num);
    Q.push(num);
    }
    //一边放入边判断
    for(int i = 1; i <= n ;i++){
    S.push(i);
    // while(Q.front()==S.top()){//这里是while,检查了半个小时!
    while(!S.empty() && Q.front()==S.top()){//这里少了判空,并且判空一定要放在前面
    Q.pop();
    S.pop();
    }
    }
    if(S.empty()){
    printf("Yes\n");
    }
    else{
    printf("No\n");
    }

    scanf("%d",&num);
    }

    printf("\n");
    scanf("%d",&n);
    }
    return 0;
    }

2018年4月11日 下午3:54

2018/8/2:

仅仅通过遍历去解释所有的问题是片面的,更多的应该是对思路的总结

技巧:

  1. 做题的时间一定要花在分析上!!!想好了再动手—1363
  2. 不要罗列所有的情况,而是要尽量按操作为单位去思考—402
  3. 要学会将最终问题转化,比如要求一个序列,那么栈/队列来表示不断形成的序列。——402
  4. 学会分析问题的方法:从最特殊的情况推理到普通的情况地牢游戏
    1. 从特殊—>一般
  5. 从少到多的迭代思想去不断的逼近最后的结果!—315

遍历的对象:

  1. 递归也是一种遍历,递归函数本身就是一次遍历,这个函数就是我们的遍历的元素
    1. 因为一次函数的调用是处理一个元素,我们是要遍历元素,所以,必然需要遍历函数,这也就成了我们的递归。但是需要注意的是,函数其中还包括着操作,而对象元素仅仅是一个数据,并没有操作。
  2. 动态规划也是可以通过遍历去解释的198. House Robber
    1. 这里的遍历对象元素是:01 02 03 04 …. 0~(n-1)
      1. 这里的数字是只下标!
    2. 一个dp[i] 与一个对象元素对应,边遍历边修改dp数组本身。
      1. 这个的不同点在于要让最后一个最大。
  3. 动态规划遍历的对象是01 02….0~(n-1),但是加上一个条件:最右边的单个元素的一定要! 53. Maximum Subarray
  4. 表面上我们遍历的的是string::s中的一个个元素,其实这一个个元素代表着“以这个元素结尾的一个【满足题目要求】的一个子串”。——76
    1. 这时我们就可以说:我们遍历的“元素”,变成了一个个的[满足要求]的子串

遍历:

  1. 我觉得所有的题都可以成为遍历数组 ——55+55_2
    1. 递归也不例外
  2. 每次遍历的对象元素是整个序列,而不是原先数组中的某个元素——315
  3. 遍历的对象元素选错了 322. Coin Change
  4. 因为我们分析问题的时候,使用的是简单的例子,容易缺少循环迭代的过程—-poj1363

数据的角度:

  1. 在遍历的过程中修改数据本身——114
  2. 遍历的对象是一个边建立边遍历的队列——199
  3. map来记录我们遍历的过程——49
  4. 数据结构选取的巧妙?某一个操作能用当前选择的数据结构直接实现,而不用在写循环呀、判断呀啥的——76
  5. 我们设置的数据类型也很重要,能让逻辑变得简单——315 + 23

2018年4月9日 上午9:58

  1. 要分清实例与tomcat的区别:这里的实例默认指没有bin,lib目录的tomcat,其他的东西是复制过来的
  2. 我的项目中没有使用公共目录bin,lib目录,而是直接使用解压的官网的解压版
  3. 站在tomcat启动的角度:需要独有的catalina_base,以及可以不独有的catalina_home。另外,如果要同时启动的话要配置不同的端口

tomcat7源码学习初始化之catalina.home和catalina.base(转) - 红无酒伤 - 博客园

tomcat配置的环境变量catalina.home和catalina.base 区别 - CSDN博客


2018年4月9日 下午6:26

Localhost:8080 Localhost:9080 访问返回不同的额JSESSIONID


http://localhost:8080/manage/user/login.do?username=admin&password=admin

  1. 我们通过nginx代理随机访问127.0.0.1:8080和127.0.0.1:9080,这两个得到的JSESSIONID是一定不一样的
  2. 但是,先通过login.do访问tomcat(暂时称为login_tomcat)得到的JSESSIONID,这个JSESSION会成为mmall_login_token和redis中的key保存起来,用作用户验证。
  3. 及其特殊的情况,如果此时login_tomcat重启,此时login_tomcat就像一个新的tomcat一样,会返回新的JESSIONID。
  4. 但是,此时mmall_login_token依然还是login_tomcat未重启时的JSESSIONID。此时一共会有三个不同的SESSION值,在这个项目中
  5. 由于我们单独把管理登录的cookie保存在www.imooc.com下,它就像一个额外的安全空间一样,不受tomcat环境的影响。不管你是几个tomcat启动,tomcat是否重启,和我没关系。
  6. 这个道理和我们将用户登录信息保存在redis中一样,独立于tomcat,这样就是方便所有的tomcat使用。
  7. 如果我们不使用cookie,只是使用redis作为登录信息的保存,那么对于每次请求,tomcat都无法和redis中的登录信息session匹配,导致一直认为是新的请求无法正常登录
    1. 这没理解下来,cookie就想是钥匙,而redis就像是锁,他们两个得匹配。
    2. 只有锁,没有钥匙,这锁永远开不了。

2018年4月8日 下午12:33

参考:
版本管理工具Git入门 –留下学习生活中的点点滴滴

在master分支edit+add,在dev分支commit

原始的状态是:

  1. master分支index.jsp有“master”字符
  2. dev分支index.jsp有“dev”字符


  3. 这种操作是无用的,那要分支干啥呀!!!!
  4. 关键就是要明白两个分支commit节点图,脑子重要时刻留意!

我本地是master、dev分支,远程也是master和dev分支,他们会自动匹配,不用专门设置

分支的原理和本质

廖海峰 分支实现原理和本质

  1. HEAD指向的是当前分支,而不是一直指向的master分支
  2. Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
  3. 只在一个分支dev上修改代码,Git合并分支也很快!就改改指针,工作区内容也不变
  4. 多个分支上都修改代码,每个分支有不同的代码,切换分支idea会自动切换代码

git checkout — README.md

廖雪峰 撤销修改

git status / git diff





git reset file(README.md)


git reset —soft

Git reset 常见用法 - 浅浅念 - 博客园


git reset —mixed



  1. 只要我们commit之后,commit的文件是一定不会丢失的
  2. mixed和soft的区别:仅仅在于soft暂存区是否会保存这次提交之后的所有变更

git reset —hard


  1. 这个会覆盖工作区的文件,慎用。否则新敲如的代码就丢了!!

git reset file(README.md)


  1. 这说明暂存区的东西一旦撤销就丢失了

删除github上的文件夹

如何在 GitHub.com 上删除某个 Repository 中的某个文件夹? - 知乎

分支策略

廖雪峰 分支策略

2018年4月7日 下午9:30

  1. 我在navicat中新建了一下数据库:programing。并且把数据库表的前缀改成了programing
  2. 第一个问题时我当前连接数据库的用户mmall,在我新建的programing数据库是没有权限的。
    1. 这里的处理方式是我直接给他换成了root用户,偷懒了
  3. 第二个问题是我要修改 mybatis-generator自动生成的mapper,dao,pojo等文件,我在这里的处理方式是使用mvn mybatis-generator:generate直接重新生成这些问题。
    1. 这个可是得小心,他会把你添加的* mapper方法进行覆盖,原先的就丢失了!
    2. 新的内容会以追加的方式加入到原来的xxxMapper.xml文件中,这里并不会覆盖
  4. 我对mybatis-generator上面问题的处理方式就是把原先的代码收到的复制过来,包括*mapper.java和 *mapper.xml两种文件
    mvn mybatis-generator:generate

Mybatis错误:Result Maps collection already contains value for *** - CSDN博客

利用mybatis-generator自动生成代码 - 菩提树下的杨过 - 博客园

2018年4月7日 下午9:04

主要参考了 Intellij IDEA 修改项目名称 - 简书,但是这篇文章并不是一个通用的解决方法,还得根据自己的实际情况来解决

  1. 这是我们就按着dispather-servlet.xml——>applicationContent.xml——>applicationContent-datasource.xml——>applicationContent-spring-session.xml的顺序去检查
  2. 我们把这里的mmall 全部替换成programing,就解决了这个问题。
  3. 在这里重要的是要学会按着程序执行的方向去解决问题

补充:

2018年4月6日 下午4:08

2018年11月19日
这篇文章的知识点与其他文章知识点的不同是:这篇文章是站在对象的角度去分析的,教我们如何使用java书写一个好的类和对象。其他文章更多的是站在线程的角度去分析问题的。

如何判断在多线程下是否会出问题?

  1. 线程安全性看当前方法、属性是否使用这节的内容进行处理
  2. 假设,两个线程执行到同一类的同一个方法的同一行语句,看这时是否会出问题!!

总结:

  1. 慕课网高并发实战(五)- 安全发布对象 - 简书这篇文章写得不全
  2. Hi,我们再来聊一聊Java的单例吧 - 简书这篇文章基本上把老师这节讲的都讲了:懒汉模式(及其各种优化、volatile优化,synchronized优化)、饿汉模式(以及它的缺点)、枚举方式、具体的知识点的讲解
  3. 这节对应的代码在singleton文件夹下。
  4. 同时也熟悉一些java的高级语法
    1. 内部类
      1. 可以new外部类的对象
    2. 安全关键字:volatile使用,synchronized使用。上节课的知识点的应用。
    3. 枚举类
      1. 语法
    4. 静态块
      1. 注意顺序
    5. 私有构造方法
      1. 懒汉+饿汉都是使用私有的构造方法作为基础。
  5. 关于懒汉模式中使用volatile关键字起效的原因
  6. 这里注意静态块和静态变量的顺序,当然这也是结合情况分析,在这里的代码中的顺序必须是这样。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package com.mmall.concurrency.example.singleton;

    import com.mmall.concurrency.annoations.ThreadSafe;

    /**
    * 饿汉模式
    * 单例实例在类装载时进行创建
    */
    @ThreadSafe
    public class SingletonExample6 {

    // 私有构造函数
    private SingletonExample6() {

    }
    // 单例对象
    private static SingletonExample6 instance = null;
    // 静态块的代码必须放在单例对象声明之前
    static {
    instance = new SingletonExample6();
    }

    // 静态的工厂方法
    public static SingletonExample6 getInstance() {
    return instance;
    }

    public static void main(String[] args) {
    System.out.println(getInstance().hashCode());
    System.out.println(getInstance().hashCode());
    }
    }