作用主机名(读取、设置)
语法:
#hostname:表示输出完整的主机名 #hostname -f:表示输出当前主机名中的FQDN(全限定域名)
作用:查看一个用户的一些基本信息(包含用户id,用户组id,附加组id…),该指令如果不指定用户则默认当前用户
语法:#id 用户名
验证信息是否正确
验证用户信息:通过文件/etc/passwd cat 验证用户组信息:通过/etc/group
作用:主要是查看服务器的进程信息
选项含义:
-e:等价于“-A”:表示列出全部的进程 -f:显示全部的列(显示全字段)
列的含义:
UID:该进程执行的用户id; PID:进程id; PPID:该进程的父级进程id,如果一个程序的父级进程找不到,该程序的进程称之为僵尸进程; C:cpu的占用率,其形式是百分比; STIME:进程的启动时间; TTY:终端设备,发起该进程的设备识别符号,如果显示”?”则表示该进程并不是由终端设备发起; TIME:进程的执行时间 CMD:该进程的名称或对应的路径
案例:在ps的结果中过滤出想要查看的进程状态
#ps -ef grep 进程名称
作用:查看服务器的进程占的资源
语法:
进入命令:#top 动态显示
退出命令:按下q键
表头含义:
PID:进程id USER:该进程对应的用户 PR:优先级 VIRT:虚拟内存 RES:常驻内存 SHR:共享内存 计算一个进程实际使用的内存 = 常驻内存 (RES) - 共享内存(SHR) *> S:表示进程的状态(sleeping,其中S表示睡眠,R表示运行) *> %cpu:表示CPU的占用百分比 *> %MEM:表示内存的占用百分比 TIME+:执行的时间 *> COMMAND:进程的名称或者路径
在运行top的时候,可以按下方便的快捷键:
M:表示将结果按照内存(MEM)从高到低进行降序排列 P:表示将结果按照CPU使用率从高到低进行降序排列 1:当服务器拥有多个cpu的时候可以使用“1”快捷键来切换是否显示各个cpu的详细信息
作用:查看目录的真是大小
#du -sh 目录路径
选项含义:
-s:summaries,只显示汇总的大小 -h:表示以较高可读性的形式进行显示
作用:用于查找文件(其参数有55个之多)
语法:#find 路径范围 选项 选项的值
选项:
-name:按照文档名称进行搜索(支持模糊搜索) -type:按照文档的类型进行搜索 文档类型:“-”表示文件(在使用find的时候需要用f替换),“d”表示文件夹
案例:使用find来搜索/etc/sane.d/目录下的所有文件 #find /etc/sane.d/ -type f
作用:用于控制一下软件的服务启动、停止、重启
用法:#service 服务名 start/stop/restart
例如:需要启动本机安装的Apache(网站服务器软件),其服务名为httpd
#service httpd start 通过ps指令来检查httpd服务是否启动;
作用:关机 (服务器慎用)
语法1:#shutdown -h now “关机提示” 或者 #shutdown -h 15:25 “关机提示”
取消关机计划:
针对于centos7.x之前的版本:ctrl+c 针对于centos7.x之后的版本:#shutdown -c
除了shutdown关机以外,还有以下几个关机命令:
#init 0 #halt poweroff
作用:查看网络连接状态
语法:netstat -tnlp
选项说明:
-t:表示只列出tcp协议的连接 -n:表示将地址从字母组合转化成ip地址,将协议转化成端口号来显示输出 -l:表示过滤出“state(状态)”列中其值为LISTEN(监听)的连接 -p:表示显示发起连接的进程pid和进程名称
作用:manual,手册(包含了Linux中全部命令,英文)
语法:#man 命令 (退出按q)
例如:#man cp #man find
作用:查看磁盘的空间
语法:
#df -h:以可读性较高的形式展示大小
作用:查看一个文件的末n行,如果n不指定,默认显示后10行
语法:#tail -n 文件路径
作用2:可以通过tail指令来查看一个文件的动态变化(变化的内容不能是用户手动添加的)
语法2:#tail -f 文件路径
退出按q
作用:查看文件,以较少的内容进行输出,按下辅助功能键来查看更多
语法:less 文件路径
辅助功能键:
数字+回车 空格键 上下方向键
作用:表示操作时间日期(读取、设置)
语法1:#date 输出的形式:2018年4月23日 星期六 15:54:28
语法2:#date +%F 输出形式:2018-03-24
等价于 #date “+%Y-%m-%d” 注意大小写
语法3:#date “+%F %T” 输出形式:2019-02-26 14:23:23
等价操作 #date “+%Y-%m-%d %H:%M:%S” 引号表示让“年月日与时分秒”成为一个不可分割的整体
语法4:获取之前或者之后的某个时间(备份)
date -d “-1day” “+%Y-%m-%d %H:%M:%S”
%F:表示完整的年月日 %T:表示完整的时分秒 %Y:表示四位年份 %m:表示两位月份(带前导0) %d:表示日期(带前导0) %H:表示小时(带前导0) %M:表示分钟(带前导0) %S:表示描述(带前导0)
作用:用来操作日历
语法:
#cal (等价于 #cal -1)直接输出当前月的日历 #cal -3 :表示输出 上一个月+本月+下个月的日历 #cal -y 年份 :表示输出 某一年份的日历
管道符: |
作用:管道一般可以用于“过滤”,“特殊”,“扩展处理”。 语法:管道不能单独使用,必须配合前面所讲的一些指令一起使用,其作用主要是辅助作用。
管道前面的输出就是后面指令的输入
过滤案例:通过管道查询出根目录下包含字母“y”的文件名称
#ls /|grep y grep指令:主要用于过滤
特殊用法案例:通过管道的操作方法来实现less的等价效果(了解)
#cat 路径 less
扩展处理:使用学过的命令,来统计某个目录下的文件总个数
#ls / wc -w
#ls:列出当前工作目录下的所有文件/文件夹的名称
列出的,蓝色名称表示文件夹,黑色的表示文件,绿色的表示其权限为拥有所有权限
#ls 路径:列出指定路径下的所有文件/文件夹的名称
#ls 选项 路径:在列出指定路径下的文件/文件夹的名称,并以指定的格式进行显示
-l:表示list,表示以详细列表的形式进行展示 -a:表示显示所有的文件/文件夹(包含隐藏文件) -h:以列表的形式并且在显示文档大小的时候以可读性较强的形式显示
mdkir(make directory ):创建目录
语法:
#mkdir 路径:在已有路径下创建目录 #mdkir -p 路径:可以创建多层不存在目录 #mdkir 路径1 路径2 路径3…:一次性创建多目录
#touch:创建文件
语法:
#touch 文件路径 #touch 路径1 路径2 路径3…:同时创建多个文件
#cp(copy):复制文件
语法:
#cp 被复制的文档路径 文档被保存的路径:复制过程可以对文件进行重命名 #cp -r 被复制的文件夹路径 文件夹被保存的路径:递归赋值。如果不加-r,目录将被忽略
作用:移动文档到新的位置
语法:
#mv 需要移动的文档路径 需要保存的位置
补充:重命名的命令也是mv,语法和移动一样
rm(remove):删除
语法:
#rm 选项 需要移动的文档路径 选项: -f(force,强制):在删除的时候不会出现提示信息,强制删除 -r:用于删除文件夹,表示递归
可以同时删除多个文档
#rm -f linux*:删除以linux开头的所有文件
- 为通配符
vim:是一款文本编辑器
语法:
vim 文件的路径(可以存在,也可以不存在) :q :退出,回到终端
一般命令的输出都会显示在终端,有些时候我需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到输出重定向技术。
覆盖输出,会覆盖掉原先的文件内容
追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加
作用1:cat有直接打开一个文件的功能。
语法1:#cat 文件
作用2:cat还可以对文件进行合并
语法2:#待合并文件路径1 路径2 … 路径n > 文件路径
1.校园网主干是由N个节点(编号1..N)组成,这些节点之间有一些单向的网路连接。若存在一条网路连接(u,v)链接了节点u和节点v,则节点u可以向节点v发送信息,但是节点v不能通过该链接向节点u发送信息。
2.在刚感染病毒时,校园网立刻切断了一些网络链接,恰好使得剩下网络连接不存在环,避免了节点被反复感染。也就是说从节点i扩散出的病毒,一定不会再回到节点i。
3.当1个病毒感染了节点后,它并不会检查这个节点是否被感染,而是直接将自身的拷贝向所有邻居节点发送,它自身则会留在当前节点。所以一个节点有可能存在多个病毒。 现在已经知道黑客在一开始在K个节点上分别投放了一个病毒。
第1行:3个整数N,M,K,1≤K≤N≤100,000,1≤M≤500,000
第2行:K个整数A[i],A[i]表示黑客在节点A[i]上放了1个病毒。1≤A[i]≤N
第3..M+2行:每行2个整数 u,v,表示存在一条从节点u到节点v的网络链接。数据保证为无环图。1≤u,v≤N
第1行:1个整数,表示最后整个网络的病毒数量 MOD 142857
4 4 1
1
1 2
1 3
2 3
3 4
6
在拓扑排序问题上加了一些改变,需要对问题进行分析,才能在找到求解方法,即在拓扑排序上做了一些改变。
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, k, x, y, ans;
const int maxn = 100005;
const int mo = 142857;
//邻接矩阵
vector<int> vec[maxn];
int InDeg[maxn], num[maxn];
queue<int> q;
void topsort() {
//清空队列
while (!q.empty())
q.pop();
//入度为0的入队
for (int i = 1; i <= n; i++)
if (!InDeg[i]) q.push(i);
//广度优先遍历
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < (vec[now].size()); i++) {
if (--InDeg[vec[now][i]] == 0) q.push(vec[now][i]);
//下一个节点的病毒数 = 其本身病毒 + 前驱节点入度数
num[vec[now][i]] = (num[vec[now][i]] + num[now]) % mo;
}
}
}
int main() {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) vec[i].clear();
memset(InDeg, 0, sizeof(InDeg));
memset(num, 0, sizeof(num));
while (k--) {
cin >> x;
num[x]++;
}
//记录初始数据
for (int i = 0; i < m; i++) {
cin >> x >> y;
vec[x].push_back(y);
InDeg[y]++;
}
topsort();
ans = 0;
for (int i = 1; i <= n; i++) {
ans = (ans + num[i]) % mo;
}
cout << ans << endl;
return 0;
}
我们都知道大学的课程是可以自己选择的,每一个学期可以自由选择打算学习的课程。唯一限制我们选课是一些课程之间的顺序关系:有的难度很大的课程可能会有一些前置课程的要求。比如课程A是课程B的前置课程,则要求先学习完A课程,才可以选择B课程。大学的教务收集了所有课程的顺序关系,但由于系统故障,可能有一些信息出现了错误。现在小Ho把信息都告诉你,请你帮小Ho判断一下这些信息是否有误。错误的信息主要是指出现了”课程A是课程B的前置课程,同时课程B也是课程A的前置课程”这样的情况。当然”课程A是课程B的前置课程,课程B是课程C的前置课程,课程C是课程A的前置课程”这类也是错误的。
第1行:1个整数T,表示数据的组数T(1 <= T <= 5)
接下来T组数据按照以下格式:
第1行:2个整数,N,M。N表示课程总数量,课程编号为1..N。M表示顺序关系的数量。1 <= N <= 100,000. 1 <= M <= 500,000
第2..M+1行:每行2个整数,A,B。表示课程A是课程B的前置课程。
第1..T行:每行1个字符串,若该组信息无误,输出"Correct",若该组信息有误,输出"Wrong"。
2
2 2
1 2
2 1
3 2
1 2
1 3
Wrong
Correct
拓扑排序问题。
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int T, n, m;
const int maxn = 100005;
vector<int> vec[maxn];
int InDeg[maxn];
queue<int> q;
bool topsort() {
//清空队列
while (!q.empty())
q.pop();
int num = 0;
//入度为0的入队
for (int i = 1; i <= n; i++)
if (!InDeg[i]) q.push(i);
//广度优先遍历
while (!q.empty()) {
int now = q.front();
q.pop();
num++;
//减入度
for (int i = 0; i < vec[now].size(); i++) {
if (--InDeg[vec[now][i]] == 0) q.push(vec[now][i]);
}
}
if (num == n)return true;
return false;
}
int main() {
cin >> T;
while (T--) {
cin >> n >> m;
for (int i = 1; i < n; i++) vec[i].clear();
memset(InDeg, 0, sizeof(InDeg));
int x, y;
//记录初始数据
for (int i = 0; i < m; i++) {
cin >> x >> y;
vec[x].push_back(y);
InDeg[y]++;
}
if (topsort()) puts("Correct");
else puts("Wrong");
}
return 0;
}
Asynchronous JavaScript And Xml 异步的
JavaScript:更新局部的网页
XML:一般用于请求数据和响应数据的封装
XMLHttpRequest对象:发送请求到服务器并获得返回结果
CSS:美化页面样式
异步:发送请求后不等返回结果,由回调函数处理结果
<script>
var xmlRequest = null;
function ajaxLogin(){
var username = document.getElementById("nameID").value;
var userpass = document.getElementById("passID").value;
//1.创建XMLHttpRequest对象
xmlRequest = new XMLHttpRequest();
//2.绑定用于接受响应消息的回调函数
xmlRequest.onreadystatechange = onRequest;
//3.打开一个URL(请求地址),指定请求方法(还未发出请求)
xmlRequest.open("post","AjaxLoginServlet",true);//true表示异步,false表示不异步
//4.在真正发送之前,我们可以设置请求头
//本例设置为模拟form表单提交,让服务器认为本次请求时form表单提交的
xmlRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//5.使用send真发出请求,并发送附加数据(若有的话)
xmlRequest.send("username="+username+"&userpass="+userpass);
/*
xmlRequest.open("get","AjaxLoginServlet?username="
+username+"&userpass="+userpass,true);
xmlRequest.send();
*/
}
//当准备状态码变化时,就会调用此方法
function onRequest(){
//只有准备状态码为4,且响应状态码为200时,认为响应完成并成功!
if(xmlRequest.readyState ==4 && xmlRequest.status == 200){
//从XMLHttpRequest对象中,获取响应的正文(responseText或responseXML)
var message = xmlRequest.responseText;
//var message = xmlRequest.responseXML;
//接下来是对响应信息进行处理
//如果message是json字符串,那么可以转换成js中的Json对象
var jsonObj = JSON.parse(message);
alert(jsonObj.maxPage);
}
}
</script>
readystate:XMLHttpRequest的状态信息
就绪状态码 | 说明 |
---|---|
0 | XMLHttpRequest对象没有完成初始化 |
1 | XMLHttpRequest对象开始发送请求 |
2 | XMLHttpRequest对象的请求发送完成 |
3 | XMLHttpRequest对象开始读取响应,还没有结束 |
4 | XMLHttpRequest对象读取响应结束 |
<script>
var xmlHttpReq = null;
function sendAjaxRequest(urlAndParam,onResponse,async){
xmlHttpReq = new XMLHttpRequest();
xmlHttpReq.onreadystatechange = onResponse;
xmlHttpReq.open("post",urlAndParam,async);
xmlHttpReq.send(null);
}
</script>
<script>
$(function(){
$("#sendText").click(function(){
var strToSend = $("#strID").val();
//接收普通文本消息
$.post("JQueryAjaxServlet",{sendMsg:strToSend},function(msg){
$("receiveText").text(msg);
});
//接收Json数据,必须在后台设置响应头"application/json"或"text/json"
$.post("JQueryAjaxServlet",{sendMsg:strToSend},function(jsonObj){
$("receiveText").text(jsonObj.received);
});
});
});
</script>
<script>
//ajax请求另一个页面load
<script type="text/javascript">
$(function(){
//前端静态ajax
$("#fh").hide();
$("#zc").click(function(){
$("#bd").load("staticRegist.form");
$("#fh").show();
});
$("#fh").click(function(){
$("#bd").load("staticLogin.form");
});
$("#bd").load("staticLogin.form");
});
</script>