目录
计算机组成原理:
控制器的基本结构
控制器的功能是解释指令(完成指令)、保证指令的按序执行。
- PC(程序计数器)寄存器保存了当前指令的地址,进行取指令,PC有计数功能。
- IR(指令寄存器)存放当前要执行的指令,将操作码送入CU进行分析。
- CU(控制单元)发出控制信号,控制相对应的部件来执行指令。
leetcode每日一题:
接雨水问题 , 三种解法.
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 -- 酒醉花下眠.