短作业优先
一、使用哈希表
创建一个哈希表,用于存储字符及其出现的次数。可以使用编程语言中提供的字典(如 Python 中的dict)或类似的数据结构。 遍历字符串s: 对于每个字符,检查它是否在哈希表中。 如果不在哈希表中,将其加入哈希表,并将其出现次数初始化为 1。 如果已经在哈希表中,将其出现次数加 1。 再次遍历字符串s: 对于每个字符,检查其在哈希表中的出现次数。 一旦找到出现次数为 1 的字符,立即返回该字符。 如果遍历完整个字符串都没有找到不重复的字符,则可以返回一个特定的值(例如None或空字符)表示没有找到。
HTTP/2 出来的目的是为了改善 HTTP 的性能。协议升级有一个很重要的地方,就是要兼容老版本的协议,否则新协议推广起来就相当困难,所幸 HTTP/2 做到了兼容 HTTP/1.1。
那么,HTTP/2 是怎么做的呢?
第一点,HTTP/2 没有在 URI 里引入新的协议名,仍然用「http://」表示明文协议,用「https://」表示加密协议,于是只需要浏览器和服务器在背后自动升级协议,这样可以让用户意识不到协议的升级,很好的实现了协议的平滑升级。
第二点,只在应用层做了改变,还是基于 TCP 协议传输,应用层方面为了保持功能上的兼容,HTTP/2 把 HTTP 分解成了「语义」和「语法」两个部分,「语义」层不做改动,与 HTTP/1.1 完全一致,比如请求方法、状态码、头字段等规则保留不变。
但是,HTTP/2 在「语法」层面做了很多改造,基本改变了 HTTP 报文的传输格式。
定义了一个bool类型,用来判断是否进行过交换,若在第一次遍历完成之后没有进行交换,则代表此时数组就是有序的了。
void bubulSort(vector& nums) {
bool isSort;
for (int i = 0; i < nums.size(); i++) {
isSort = false;
for (int j = 0; j < nums.size() - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
isSort=true;//如果发生交换 值为true
}
}
if (!isSort) {
break;
}
}
}
快排核心代码如下:
1.首先,最好定义一个交换函数,方便之后的使用
void swap(vector& nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
2.然后,定义函数,用来进行快排的第一次划分,返回的是基准值的下标
快速排序的核心操作:“哨兵划分”,其目标是:选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。
快排的分治策略
哨兵划分的实质是将一个较长数组的排序问题简化为两个较短数组的排序问题。
哨兵划分完成后,原数组被划分成三部分:左子数组、基准数、右子数组,且满足“左子数组任意元素 <<基准数 <<右子数组任意元素”。因此,我们接下来只需对这两个子数组进行排序。
int fastNum(vector& nums,int left,int right) {//1.定义一个基准值
int i =left; //基准元素
int j =right;
while (i < j) {
while (i < j && nums[j]>=nums[left]) {
j--;
}
while (i < j && nums[i] <= nums[left]) {
i++;
}
swap(nums,i,j);
}
//将基准数放到两个子数组的分界线
swap(nums,left,i);
return i; //返回基准数的下标
}
3.定义快排的入口函数,
首先,对原数组执行一次“哨兵划分”,得到未排序的左子数组和右子数组。
然后,对左子数组和右子数组分别递归执行“哨兵划分”。
持续递归,直至子数组长度为 1 时终止,从而完成整个数组的排序。
void quickSort(vector& nums, int left, int right) {
if (left >= right) {
return;
}
int pivot = fastNum(nums,left,right);
quickSort(nums,left,pivot-1);
quickSort(nums,pivot+1,right);
}
例如:-rwxr--r-- 请判断文件的权限情况是怎么样的?
首先 以-开头代表这是文件,如果是目录,则是以d开头
r(4)w(2)x(1) 可知该文件的权限值是744
第一个rwx代表文件拥有者对该文件有
“r”(read)代表读取权限,拥有该权限的用户可以查看文件的内容。
“w”(write)代表写入权限,允许用户修改文件的内容、删除文件等操作。
“x”(execute)代表执行权限。对于可执行文件(如二进制程序、脚本等),拥有执行权限的用户可以运行该文件。对于目录来说,拥有执行权限意味着用户可以进入该目录(访问目录下的文件和子目录)。
第二个r-- 代表与文件拥有者同组的用户对该文件有读取的权限
第三个r-- 代表其他用户对该文件也有读取的权限
1.data section 数据段 和代码段
2.file fd 文件描述符 包括打开文件的状态(包括文件的当前位置指针、文件的访问模式等)。
3.线程属于同一个进程,因此共享相同的进程 ID 和父进程 ID。
1.线程栈 线程 ID
2.寄存器 register set (线程上下文包括线程的寄存器状态、程序计数器等。当操作系统进行线程切换时,会保存当前线程的上下文,并恢复下一个要执行的线程的上下文。每个线程的上下文是私有的,确保线程在被切换回来时能够从上次暂停的地方继续执行。)