“21 天好习惯”第一期-5

目录

计算机组成原理:

leetcode每日一题:

Java学习: 


计算机组成原理:

控制器的基本结构

控制器的功能是解释指令(完成指令)、保证指令的按序执行。

  • PC(程序计数器)寄存器保存了当前指令的地址,进行取指令,PC有计数功能。
  • IR(指令寄存器)存放当前要执行的指令,将操作码送入CU进行分析。
  • CU(控制单元)发出控制信号,控制相对应的部件来执行指令。

leetcode每日一题:

次元门(\\v\\):

接雨水问题 , 三种解法.

NO 1: 单调栈.

        对单调栈的回退(出栈)过程进行模拟 , 就可很明确的得到计算过程. 

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size() , re = 0 , left = 0;
        stack<int>sta;

        for(int i = 0;i < n;i ++){
            while(!sta.empty() && height[i] > height[sta.top()]){
                int cnt = sta.top();
                sta.pop();

                if(sta.empty()) break;

                int left = sta.top();
                int col = i - left - 1;
                int row = min(height[left] , height[i]) - height[cnt];
                re += col * row;

            }
            sta.push(i);
        }

        return re;
    }
};

NO 2: dp 动态规划

        从左往右遍历: 假设最右端存在一个 无限高 的柱子 , 计算每个柱子最多可以积累的水;

        从右往左遍历: 假设最左端存在一个 无限高 的柱子 , 计算每个柱子最多可以积累的水;

        取 min - height 就是该单元格能接的水.

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size() , re = 0;
        
        vector<int>dp_left(n , 0);
        int left = height[0];
        vector<int>dp_right(n , 0);
        int right = height[n - 1];

        for(int i = 0;i < n;i ++){
            left = max(left , height[i]);
            dp_left[i] = left;
        }

        for(int i = n - 1;i >= 0;i --){
            right = max(right , height[i]);
            dp_right[i] = right;
        }

        for(int i = 0;i < n;i ++){
            re += min(dp_right[i] , dp_left[i]) - height[i];
        }

        return re;
    }
};

NO 3: 双指针

        逐个计算最大储水量 , 两峰值取 min - height[left(right)] 就是该单元的最大储水量 , 该单元的两边的峰值 , 就可以用双指针求解.

class Solution {
public:
    int trap(vector<int>& height) {
        int left = 0 , right = height.size() - 1 , re = 0;
        int max_left = 0 , max_right = 0;
        
        while(left < right){
            if(height[left] < height[right]) max_left = max(max_left , height[left]) , re +=  max_left - height[left] , ++ left;
            else max_right = max(max_right , height[right]) , re += max_right - height[right] , -- right;
        }

        return re;
    }
};

Java学习: 

string的用法: 

1.判断字符串的长度
str.length() , str.lastIndexOf("") //返回字符串的长度
//int size = str.length();

2.判断子字符串是否出现在字符串 , 判断子字符串第一次出现的位置
str.indexOf("xxx") //搜索子字符串第一次出现的位置
//int place = str.indexOf("xxx");

3.判断子字符串最后一次出现的位置
str.lastIndexOf("xxx") //返回子字符串最后出现的位置
//当xxx为空时,返回字符长度
//int lastplace = str.lastIndexOf("xxx");

4.判断第n位上的字符是什么
str.charAt(n) //返回下标n上的字符char
//char c = str.charAt(n);

5.截取字符串
str.substring(x , y) //截取字符串 y代表end()
//当设置end()时,到字符结尾
//str = str.substring(x , y);

6.删去前缀,删去后缀
str.trim() //去前余,后缀空格
//str = str.trim();

7.替换字符
str.replace("x" , "X") //将字符串中的x全部替换成X
//str = str.replace("x" , "X");

8.判断前缀 , 判断后缀
str.startsWith("xxx") //判断前缀是否是xxx
str.endsWith("xxx") //判断后缀是否是xxx
//boolean bo = str.startsWith("xxx")

9.判断字符串是否相同
str.equals(newstr) 
//Java中的 "==" 判断的是储存地址 , 而equals才是判断是否具有相同的字符和长度
str.equalslgnoreCase(newstr) //不区分大小写

10.判断字符串大小
str.compareTo(newstr) //判断字符串大小 , 若str字典序小于newstr , 则返回负数
//Java不能同C ++一样用>,<比较字典序

11.字符串大小写转换
str.toLowerCase(str) //所有字符转换成小写
str.toUpperCase(str) //所有字符转换成大写

12.字符串分割(计算单词数)
String[] strs = str.split("x" , (int)n) //按x分割,不包含x.n表示分割出的个数

13.记录时刻
int time = System.currentTimeMillis();

14.大量修改
StringBuffer str = new StringBuffer(""); //多线程
StringBuilder str = new StringBuilder("");

15.添加字符/字符串
str.append(auto); //auto : int , boolean , char , String , double

16.插入字符/字符串
str.insert(int , auto) //auto : int , double , char , boolean , String
//int 为插入的下标位

17.删除字符/字符串
str.delete(start , end) //end -> end();

春水初生 春林初盛     春风十里不如你.Day Five -- 酒醉花下眠.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值