自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 收藏
  • 关注

原创 二、Linux用户管理、组管理及权限管理

Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员(root用户)申请一个账号,然后以这个账号的身份进入系统。每个用户账号都拥有一个唯一的用户名和各自的密码。Linux 的用户需要至少要属于一个组,也可以属于多个组。用户在登录时输入正确的用户名和密码后,就能够进入系统和自己的主目录。Linux用户管理实现用户账号的管理,要完成的工作主要有如下几个方面:(1)用户账号的添加、删除与修改;(2)用户密码的管理;(3)用户组的管理。whoami指令

2022-03-06 18:57:23 6477

原创 HJ1 字符串最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)#include <iostream>#include <string>using namespace std;int main(){ string s; getline(cin,s); size_t pos = s.rfind(' '); if (pos == string::npos) { //没有找到 cout << s.size(

2022-03-03 21:29:27 570

原创 leetcode 387. 字符串中的第一个唯一字符

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。输入: s = “loveleetcode”输出: 2class Solution {public: int firstUniqChar(string s) { int countArray[26] = {0}; for(int i = 0; i < s.size(); i++) { countArray[s[i]-

2022-02-27 20:08:50 510

原创 leetcode 917. 仅仅反转字母

给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。返回反转后的 s 。class Solution {public: bool IsLetter(char ch) { if((ch >= 'A'&& ch <='Z') || (ch >='a' && ch <='z')) { return true;

2022-02-27 19:40:22 234

原创 HJ73 计算日期到天数转换

描述根据输入的日期,计算是这一年的第几天。保证年份为4位数且日期合法。进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(1)\O(1)输入描述:输入一行,每行空格分割,分别是年,月,日输出描述:输出是这一年的第几天#include <iostream>using namespace std;int GetMonthDay(int year, int month){ int monthDayArray[13] = {0,31,28,31,30,31,30,31

2022-02-20 22:06:04 458

原创 声明、定义、初始化、赋值的区别

文章目录声明变量定义变量声明和定义的区别变量初始化赋值左值和右值局部变量和全局变量的初始值声明变量所谓声明有两种含义:(1)这个对象名(变量名)已经和一块内存空间匹配了,下面的代码用到这个对象名(变量名)是在别的地方已经定义的。(2)这个名字被预定了,其他地方不能用它来作为对象名(变量名),比如函数声明中的参数。声明可以声明多次。extern int a;//声明外部变量aextern关键字:声明外部符号,表示变量或函数的定义在别的文件中,下面用到这个变量或函数是外来的,不是在本文件中定义的。定

2022-02-19 12:17:45 1832 1

原创 数据结构之栈和队列

文章目录栈队列队列的概念及结构队列的实现本章学习线性表中的栈和队列。栈队列队列的概念及结构队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。队列的特点:1.队列具有先进先出FIFO(First In First Out) 或者后进后出LILO(Last In Last Out)2.队列只能在队头和队尾进行数据操作队列的实现队列也可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构(顺序存储,

2022-01-11 13:39:23 632

原创 leetcode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。

2022-01-11 13:37:36 241

原创 leetcode 20.有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。思路:遇到左括号,进栈,遇到右括号,出栈匹配考虑两种情况:1.遇到右括号,但是栈尾空2.右括号都匹配完了,栈中还有左括号typedef char STDataType;typedef struct Stack{ STDataType* a; int top; int capacity;}ST;vo

2022-01-09 22:39:02 248 4

原创 顺序表、链表

文章目录线性表顺序表概念及结构接口实现相关OJ链表本章我们主要学习线性表中的顺序表和链表。线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。线性表在逻辑上是线性结构(一对一)。但是在物理结构上并不一定是连续的,在计算机存储器中的存储一般有两种形式,一种是顺序存储(内存空间连续,数组),一种是链式存储(内存空间不一定连续)。常见的线性表:顺序表、链表、栈、队列、字符串…顺序表概念及结构顺

2022-01-09 17:23:47 1246

原创 leetcode 138.复制带随机指针的链表

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。思路:1.复制原链表的所有结点,将新结点各自插入到原结点的后面2.根据原结点的random

2022-01-07 22:05:41 376 1

原创 leetcode 142.环形链表II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。不允许修改 链表。输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。思路1:首先,判断链表是否有环,使用快慢指针来判断,如果有环,找到快慢指针相遇的结点其次,如果有环,定义两个指针,分别从链表头结点cur和快慢指针相遇的结点meet开始走,两个指针每次都走一步,那么这两个指针必然在入环第一个结点处相遇。struct ListN

2022-01-07 16:37:22 458

原创 leetcode 141.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中

2022-01-07 10:48:49 134

原创 leetcode 160. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:思路1:暴力求解(穷举法)依次取A链表中的每个结点和B链表中的所有结点进行比较,如果有地址相同的结点,就是相交,第一个相交的点。时间复杂度是O(N2N^2N2)思路2:时间复杂度优化到O(N)1.分别遍历两个链表,记住长度,如果两个链表的尾结点相同,则必然相交,否则不相交。2.找交点:让长的链表先走(走长度差),然

2022-01-06 20:15:57 344 1

原创 牛客OR36 .链表的回文结构

对于一个链表,请设计一个时间复杂度为O(n), 额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。思路1:找到链表的中间结点,然后拆开链表,分成两部分,将后半部分逆置,后半部分和前部分比较是否相等,只要有一个走到NULL了,就结束(1)偶数个(2)奇数个这种方法,要把链表拆开思路2:不拆链表(1)偶数个找到中间结点,中间结点后的部分逆置,不要拆开(2)奇数个stru

2022-01-06 16:34:09 1019

原创 牛客CM11 链表分割

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。如果不要求保持相对顺序不变,那么小于x的结点头插,大于x的结点尾插。但是要求保持相对顺序不变,这种方法就不适用。创建两个新链表,一个存放小于x的结点,一个存放大于x的结点,然后将两个链表链接起来。创建两个带哨兵位的头结点这里要注意,在原链表中,结点7的下一个结点是3,所以这里必须将结点7的next置为NULL,

2022-01-06 14:13:06 164

原创 leetcode 21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]思路:依次比较两个链表结点,取小的那个结点尾插到新链表中。初始条件:要记住新链表的头结点,使用指针head来记录新链表的头结点使用指针tail来记录新链表的尾结点struct ListNode { int val; struct ListNode* next;};struct

2022-01-06 10:24:16 593

原创 leetcode 876.链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。示例 2:输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6])由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。思路1:遍历链表,求出长度,再次遍历找到中间结点,需要遍历链表两次,时间复杂度O(N).思路2:要求

2022-01-06 08:53:05 502

原创 leetcode 206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]思路1:初始时,n1 = NULL, n2 = head, n3 = head->nextn2的next赋值为n1n1 赋值为n2, n2赋值为n3,n3赋值为n3->nextn2的next赋值为n1n1赋值为n2,n2赋值为n3,n3赋值为n3->next重复上述操作结束条件:n2 = NULLstruct

2022-01-05 21:40:09 247

原创 leetcode 203.移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]思路:使用两个指针,prev和cur,cur记录当前指针位置,prev记录前一个位置如果cur->

2022-01-05 15:43:01 252

原创 leetcode 88.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。例1:输入:nums1 = [1,2,3,0,0,

2022-01-04 22:31:54 402 2

原创 leetcode 572.另外一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。思路:用subRoot和root的每一个子树进行比较。subRoot先和root比较,如果相等返回true,否则,subRoot和root->left比较,如果相等返回true,否则subRoot和roo

2021-11-14 12:22:56 277

原创 leetcode 145.二叉树的后序遍历

给定一个二叉树,返回它的 后序 遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free(). *//

2021-11-14 11:54:08 526

原创 leetcode 94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回它的 中序 遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free

2021-11-14 11:44:10 548

原创 leetcode 101.对称二叉树

给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:思路:把左右子树看成单独的两个树,两棵树进行比较(参考leetcode 100,链接)/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struc

2021-11-14 11:19:18 219

原创 leetcode 100.相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。先比较根,根相等,再比较左子树,左子树相等,再去比较右子树,如此一直比较下去,直到所有节点比较完。时间复杂度是O(N)/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct T

2021-11-14 10:55:50 369

原创 leetcode 144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

2021-11-14 10:35:05 376

原创 leetcode 965.单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。思路:父亲 = 左孩子父亲 = 右孩子父亲和左右孩子比,然后孩子作为父亲,再和它的左右孩子比/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right;

2021-11-14 10:33:27 65

原创 leetcode 225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。首先实现队列,创建两个队列实现入栈:向不为空的队列中入队,保持另一个队列为空实现出栈:依次出队将数据转移到空队列中保存,只剩最后一个数据出队列画图代码实现//队列数据类型typedef int QDataType;//队列中数据结构体typedef struct QueueNode{ struct QueueNode* next; QDataType d

2021-11-01 22:47:02 165 1

原创 leetcode 232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false一个栈用来入数据,一个栈用来出数据...

2021-11-01 22:42:51 97

原创 leetcode 27. 移除元素

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路1:遍历数组,找到所有等于val的值,后面的元素全部前移时间复杂度:最坏情况下,O(N^2)思路2:重新开辟一个数组tmp,遍历原数组,把不是val的数全部放到新数组中tmp,再把tmp数组拷贝到原数组中时间复杂度)O(N)空间复杂度为:O(

2021-10-30 14:36:40 108

原创 189. 旋转数组

题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]思路1:暴力求法1.每次把最后一个数拿出来,放在临时变量中2.剩余全其他所有元素后移一位3.把最后一个数放到第一个位置时间复杂度:O(N*k)空间复杂度:O(1)思路2:开辟额外空间,

2021-10-29 14:33:47 73

原创 面试题 17.04. 消失的数字

题目描述:数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?示例 1:输入:[3,0,1]输出:2示例 2:输入:[9,6,4,2,3,5,7,0,1]输出:8思路1:排序,使用qsort快排,时间复杂度是O(n*log2Nlog2^Nlog2N)思路2:(0+1+2+…+n) - (a[0]+a[1]+…+a[n-1]),时间复杂度是O(N),空间复杂度是O(1)int missingNumber(int* nums, in

2021-10-29 14:04:16 101

原创 数据结构和算法基本概念

文章目录什么是数据结构?数据数据元素数据结构数据之间的结构关系逻辑结构存储结构什么是算法?算法的特性评价算法好坏的方法时间复杂度大O的渐进表示法空间复杂度什么是数据结构?数据数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。文字、视频、音频等等,都是数据,数据并不仅仅指数字。数据元素数据元素是数据的基本单位,又称之为记录(Record)。一般数据元素由若干基本数据项组成。数据结构数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一

2021-10-29 13:37:58 546

原创 寻找单身狗

题目:找单身狗一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。分组:只出现1次的两个数,不能在同一个组中,那么分组的依据是什么呢?怎么分?两个相同数字异或的结果为0(相同为0,不同为1),异或支持交换律,因为这组数中只有两个数字只出现一次,那么这组数全部异或的结果就是这两个数字异或的结果,找到这个结果的二进制中为1的那一位,说明这两个数字的该二进制位不同,那么就有了分组的依据,数组中,该二进制位为1的数字分在一组,该二进制位为0的数字分在另一组。

2021-10-25 23:05:51 71

原创 文件版通讯录

文章目录1.程序退出时,将通讯录信息写入文件2.程序运行起来,首先从文件中加载联系人信息  我们之前的通讯录在程序关闭后,联系人信息就销毁了,那我们如果想存储联系人信息该怎么办?我们学习完文件操作之后,知道文件是保存在持久化存储设备(硬盘、U盘、光盘…)上的一段数据。那么我们可以在程序退出之前,把联系人信息存储到文件中,等我们再次运行程序时,需要先把联系人信息从文件中加载到程序中。针对动态版的通讯录,我们来做一些改进。1.程序退出时,将通讯录信息写入文件2.程序运行起来,首先从文件中加载联系人信息

2021-10-25 22:52:50 562

原创 程序环境和预处理

文章目录程序的翻译环境和执行环境翻译环境执行环境程序的翻译环境和执行环境翻译环境执行环境库函数在链接库中

2021-10-24 23:34:53 136

原创 leetcode 876. 链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NU

2021-10-21 22:10:57 44

原创 剑指offer - 链表中倒数第k个结点

题目:链表中倒数第k个结点题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入:1,{1,2,3,4,5}返回值:{5}分析:使用快慢指针(1)fast指针先走k步(2)fast指针、slow指针同时走相同的步数,直到fast走到链表结尾(3)slow指针指向的就是倒数第k个结点假设有如下链表:假设k=3快慢指针指向头fast走k步fast、slow走相同的步数,直到fast为NULL,此时slow指向倒数第k个结点代码实现如下:struct ListNo

2021-10-21 21:52:06 116

原创 C语言文件操作

文章目录什么是文件?程序文件数据文件文件名文件的打开和关闭文件指针文件的打开和关闭标准输入流、标准输出流文件读写文件的顺序读写文本文件读写二进制文件读写对比三组函数文件的随机读写本章我们来学习一下c语言的文件操作。什么是文件?文件是保存在持久化存储设备(硬盘、U盘、光盘…)上的一段数据。在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件文件的内容

2021-10-18 16:05:13 631 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除