算法题(牛客网)
1. 编辑距离(二)
这一题跟下面那题,多了个修改的权值。
2. 编辑距离(一)
一直弄不清楚当末尾字符串不相同时,前三种状态如何转换到当前状态,有一个博主解释的很好。@吴师兄学算法
代码详情:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int minEditCost(string str1, string str2, int ic, int dc, int rc) {
int m = str1.size(), n = str2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); //动态规划
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; ++j) {
if (j == 0) dp[i][j] = i * dc;
else if (i == 0) dp[i][j] = j * ic;
else if (str1[i - 1] == str2[j - 1]) { //末尾字符相同
dp[i][j] = dp[i - 1][j - 1];
}
else { //末尾字符不相同
dp[i][j] = min(dp[i - 1][j - 1] + rc, min(dp[i - 1][j] + dc, dp[i][j - 1] + ic));
}
}
}
return dp[m][n];
}
};
/*
输入数据:
abc
adc
5 3 2
*/
int main() {
string str1, str2;
cin >> str1 >> str2;
int ic, dc, rc; //ic对应插入,dc对应删除,rc对应替换
cin >> ic >> dc >> rc;
Solution sl;
cout << sl.minEditCost(str1, str2, ic, dc, rc) << endl;
return 0;
}
代码详情(ACM模式):
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int editDistance(string str1, string str2) {
int m = str1.size(), n = str2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); //动态规划
//边界初始化
for (int i = 0; i <= m; ++i) {
dp[i][0] = i;
}
for (int j = 0; j <= n; ++j) {
dp[0][j] = j;
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (str1[i - 1] == str2[j - 1]) { //末尾字符相同
dp[i][j] = dp[i - 1][j - 1];
}
else { //末尾字符不相同
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
}
}
return dp[m][n];
}
};
/*
输入数据:
nowcoder
new
*/
int main() {
string str1, str2;
cin >> str1 >> str2;
Solution sl;
cout << sl.editDistance(str1, str2) << endl;
return 0;
}
面试题
1. 操作系统中进程调度策略有哪几种?
1. FCFS(先来先服务,队列实现,非抢占):所有进程平等,缺点:无法让紧急进程优先
2. SJF(最短作业优先):缺点:难以找到哪个进程最短
3. 优先级调度算法(可抢占):优先级越高越先分配,相同优先级先来先服务。缺点:会出现饥饿现象。
4. 时间片轮转调度算法(可抢占):每个进程分配一个时间片的CPU时间,进程CPU超过时间片,则被抢占并放回队列。
5. 多级队列调度算法:将就绪队列分成多个独立队列,每个队列有各自的调度算法,队列之间采用固定优先级抢占调度。进程被永久分配在一个队列里。
6. 多级反馈队列调度算法:与多级队列调度算法相比,进程可以在队列之间移动。可以防止饥饿现象。
2. GET与POST的区别
1. 功能上:GET从服务器获取资源,POST更新服务器资源。
2. 请求参数形式:GET请求将数据放置HTTP报文的请求头中,POST请求将数据防止HTTP报文的请求体中。
3. 安全性:POST请求比GET请求安全。因为GET请求将数据明文出现在URL上。
4. 请求大小:GET请求长度受限于浏览器或服务器对URL长度的限制,而POST请求无限制。
3. 计算机内部如何存储负数和浮点数?
负数:通过标志位和补码表示。补码:正数反码加1,方便加减运算。
浮点数:符号位+指数位+尾数部分。
4. 什么是虚拟内存?
虚拟内存:每个进程拥有独立地址空间,空间被分为许多相同大小的页,运行部分在物理内存中,未运行部分在外存中,那部分缺少,就从外存调入物理内存运行。而对进程而言,逻辑上有很大的内存空间。
5. 从输入网址到获得页面的过程
1. 浏览器查询DNS:获取域名对应的IP地址。
2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求链接,发起三次握手。
3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求。
4. 服务器接收请求,根据路径参数映射到请求处理器处理,将处理结果返回浏览器。
5. 浏览器解析并渲染视图。
今天4399发来邮件了,心心念念的邮件发来了,却是感谢信,伤心了一阵子,用游戏麻木了自己,是自己实力太差了,3个月后可以再次投递,这三个月我决定不再娱乐,三个月内用unity做出一款合格的3d游戏!!!加油~,依旧每天2道算法题,一道真题,加8道面试题。