Linux指令整理与算法解题实践
一、Linux基础知识梳理
今天整理了Linux系统的核心特点、文件分类以及开发中常用的命令,形成可直接参考的笔记。
1. Linux系统特点
- 开源:源代码公开,可自由修改和分发
- 多用户:支持多个用户同时登录使用
- 多任务:能同时高效调度多个程序运行
- 一切皆文件:设备、目录、进程等都被视为文件
2. 文件类型标识
- 普通文件:- (如文本文件、二进制文件等)
- 目录文件:d (存储其他文件或目录)
- 设备文件:b(块设备,如硬盘)、c(字符设备,如键盘)
- 软链接:l (指向原文件的快捷方式,原文件删除则失效)
- 管道文件:p (用于进程间通信)
- 套接字:s (用于网络通信)
3. 常用命令详解
(1)输出重定向与管道
>覆盖输出,>>追加输出|管道符:将前一个命令的输出作为下一个命令的输入,常与grep、less、wc搭配使用- 示例:
ls -l | grep ".txt"过滤当前目录的txt文件
(2)ls 命令
ls -l:详细列表显示权限、所有者、大小、修改时间等ls -a:显示所有文件(含隐藏文件)ls -h:人性化显示文件大小(如KB、MB)
(3)硬链接与软链接
- 硬链接:
ln 源文件 链接文件,与原文件共用inode,删除原文件不影响链接文件 - 软链接:
ln -s 源文件 链接文件,单独inode指向原文件路径,原文件删除则链接失效
(4)软件安装与卸载
apt命令(Debian/Ubuntu):apt install安装、apt remove卸载、apt update更新源dpkg命令:dpkg -i安装本地deb包、dpkg -r卸载
(5)压缩与解压
tar命令:tar -zcvf 包名.tar.gz 目标文件压缩,tar -zxvf 包名.tar.gz解压zip命令:zip 包名.zip 目标文件压缩,unzip 包名.zip解压
(6)时间相关命令
date:直接输入显示当前时间(CST中国标准时间)date +格式:+%F年月日,+%T时分秒,+%F %T同时显示date -d "-1 day"显示一天前时间,单位可换为 year、month、hour、minute、second,+表示未来,-表示过去cal:显示当前月日历,cal -3显示前后三月,cal 年份显示全年,cal 月 年显示指定月
(7)man 命令
语法:man 命令,查看命令详细手册,按 q 退出。
二、算法刷题实战
今天练习了四道中等难度的经典题目,覆盖滑动窗口、双指针、链表、贪心等思路。每道题都附完整代码和简要解析。
1. 无重复字符的最长子串
题目:给定字符串 s,找出不含重复字符的最长子串长度。
思路:滑动窗口 + 哈希集合。左右指针构成窗口,右指针遍历,遇到重复字符时左指针收缩并删除集合中对应字符,然后插入当前字符并更新最大长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> st;
int maxLen = 0, left = 0;
for (int right = 0; right < s.size(); ++right) {
while (st.count(s[right])) {
st.erase(s[left++]);
}
st.insert(s[right]);
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};
2. 盛最多水的容器
题目:整数数组 height 表示垂线高度,找出两条线与x轴围成的容器能装的最大水量。
思路:双指针从两端向中间移动。水量 = 宽度 × 最小高度。每次移动高度较小的指针,因为移动较高的指针水量必然减少。
class Solution {
public:
int maxArea(vector<int>& height) {
int water = 0, left = 0, right = height.size() - 1;
while (left < right) {
int h = min(height[left], height[right]);
int w = right - left;
water = max(water, h * w);
if (height[left] < height[right]) ++left;
else --right;
}
return water;
}
};
3. 随机链表的复制
题目:复制一个带有随机指针的链表。
思路:三步法。先在每个原节点后插入复制节点;再处理random指针,新节点random指向原节点random的next;最后拆分链表取出新节点。
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head) return nullptr;
Node* cur = head;
// 在每个原节点后插入复制节点
while (cur) {
Node* newNode = new Node(cur->val);
newNode->next = cur->next;
cur->next = newNode;
cur = newNode->next;
}
// 处理random指针
cur = head;
while (cur) {
Node* newNode = cur->next;
newNode->random = cur->random ? cur->random->next : nullptr;
cur = newNode->next;
}
// 拆分链表
Node* newHead = head->next;
Node* curNew = newHead;
cur = head;
while (cur && curNew) {
cur->next = curNew->next;
cur = cur->next;
if (cur) {
curNew->next = cur->next;
curNew = curNew->next;
}
}
return newHead;
}
};
4. 字典序最小回文串
题目:将字符串改为回文串,替换字符时确保字典序最小。
思路:双指针从两端向中间遍历。字符不同时,将较大的字符替换为较小的;相同则直接移动指针。
class Solution {
public:
string makeSmallestPalindrome(string s) {
int l = 0, r = s.size() - 1;
while (l < r) {
if (s[l] == s[r]) {
++l; --r;
} else if (s[l] < s[r]) {
s[r--] = s[l++];
} else {
s[l++] = s[r--];
}
}
return s;
}
};