- 博客(61)
- 收藏
- 关注
原创 C语言中switch语句
#include<stdio.h>int main(){int day=8;switch(day){case 1:printf(“星期一\n”);break;case 2:printf(“星期二\n”);break;case 3:printf(“星期三\n”);break;case 4:printf(“星期四\n”);break;case 5:printf(“星期五\n”);break;case 6:printf(“星期六\n”);break;ca
2021-06-14 11:56:09
228
原创 C语言中代码风格对比
//代码1if (condition) {return x;}return y;//代码2if(condition){return x;}else{return y;}//代码2更好,更加清晰//代码3int num = 1;if(num == 5){printf(“hehe\n”);}//代码4int num = 1;if(5 == num){printf(“hehe\n”);}//代码4的代码风格更好,因为如果我们不小心把"==“写成了”="的话,
2021-06-14 11:54:19
193
原创 C语言中的指针
#include<stdio.h>int main(){char ch=‘w’;char*p=&ch;*p=‘h’; //改变指针指向printf("%c\n",*p); //输出结果位hreturn 0;}#include<stdio.h>#include<string.h>int main(){//指针大小在32位平台是4个字节,64位平台是8个字节printf("%d\n",sizeof(char*)); //8pri
2021-06-14 11:50:28
154
原创 C语言中的static关键字
#include<stdio.h>void test(){int i=0;i++;printf("%d\n",i);}int main(){int i=0;for(i=0;i<10;i++){test();}return 0;}1.static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。#include<stdio.h>void test(){static int i=0; //sta
2021-06-14 11:42:51
391
原创 C语言中的typedef关键字
typedef unsigned int unit_32; //typedef关键字将unsigned int类型重命名为unit_32类型#include<stdio.h>#include<string.h>int main(){unsigned int sum1=0;unit_32 sum2=0;printf("%d\n",sizeof(sum1)); //sum1和sum2是同一类型的变量printf("%d\n",sizeof(sum2));
2021-06-14 11:32:33
200
原创 C语言中的while循坏
#include<stdio.h>int main(){printf(“请选择:\n”);int p=0;while(p<=5){printf(“hahhaha\n”);//打印6次hahahhap++;}if(p>=6){printf(“hehehhhe\n”);//打印一次hehhehehe}return 0;}
2021-06-14 11:30:55
106
原创 C语言中的字符串
#include<stdio.h>#include<string.h>int main(){char arr1[]={“bit”};char arr2[]={‘b’,‘i’,‘t’};char arr3[]={‘b’,‘i’,‘t’,’\t’};//char a=sizeof(arr1);printf("%s\n",arr1); //输出结果:bitprintf("%s\n",arr2); //输出结果:bitprintf("%s\n",arr3); //输出结果
2021-06-14 11:26:37
124
原创 C语言中的函数
/*//常规写法:#include<stdio.h>int main(){int sum1=0;int sum2=0;int sum=0;printf(“请输入两个操作数:”);scanf("%d %d",&sum1,&sum2);sum=sum1+sum2;printf(“sum=%d\n”,sum);return 0;}*///编写一个加法函数写法:#include<stdio.h>int add(int x,int y)//函数
2021-06-14 11:18:13
145
原创 C语言中的转义字符、sizeof与strlen的区别
//程序输出什么?#include <stdio.h>#include<string.h>int main(){printf("%d\n", sizeof(“abcdef”));//输出结果为7,sizeof计算字符串的长度加上了\0printf("%d\n",strlen(“abcdef”));//输出结果为6,strlen计算字符串的长度没有加\0printf("%d\n", strlen(“c:es\t\328es\t.c”));//输出结果为12,因为\t析成一
2021-06-14 11:15:18
494
原创 C语言中四种常量
1.枚举常量2.字面常量3.const修饰的常变量4.define标识符常量#include<stdio.h>enum sex{male,//男female,//女secret// 秘密}; //枚举常量int main(){3.14; //字面常量1000; //字面常量const float p=3.14f; //const修饰的常量//p=5.12; //会报错,const修饰的变量不能改变#define max 100;/
2021-06-14 11:08:16
421
原创 平衡二叉树
题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。代码思路:如果使用自底向上的做法,则对于每个节点,函数height 只会被调用一次。自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。代码实现:c
2021-04-23 16:44:52
100
原创 2021-04-23
题目描述:给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。代码思路:思路和算法:这是一种最朴素的方法——深度优先搜索枚举 s中的每一个节点,判断这个点的子树是否和 t相等。如何判断一个节点的子树是否和 t相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和 t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。代码实现:
2021-04-23 15:26:37
140
原创 二叉树的后序遍历
题目描述:给定一个二叉树,返回它的 后序 遍历。代码实现:方法一:(递归)class Solution {public:void postorder(TreeNode* root,vector &ans){if(root==NULL)return ;postorder(root->left,ans);postorder(root->right,ans);ans.push_back(root->val);}vector postorderTraversal
2021-04-23 15:11:23
290
原创 二叉树的中序遍历
题目描述:给定一个二叉树的根节点 root ,返回它的 中序 遍历。解题思路:按照左子树->根节点->右子树顺序访问二叉树代码实现:方法一:(递归)class Solution {public:void inorder(TreeNode* root,vector &ans){if(root==NULL)return;inorder(root->left,ans);ans.push_back(root->val);inorder(root->r
2021-04-20 22:52:33
145
原创 二叉树的前序遍历
题目描述:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。代码思路:前序遍历是指访问二叉树的顺序为:根节点->左子树->右子树代码实现:方法一:(迭代)class Solution {public:vector preorderTraversal(TreeNode* root) {vector result;if(!root)return result;stack<TreeNode*> S;S.push(root);while(!S.empty()
2021-04-20 21:40:45
190
原创 对称二叉树
题目描述:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3解题思路:我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q指针一开始都指向这棵树的根,随后 p 右移时,q左移,p 左移时,q右移。每次检查当前 p 和 q节点的值是否相等,
2021-04-11 16:59:59
79
原创 相同的树
题目描述:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入:p = [1,2,3], q = [1,2,3]输出:true示例 2:输入:p = [1,2], q = [1,null,2]输出:false示例 3:输入:p = [1,2,1], q = [1,1,2]输出:false解题思路:深度优先搜索如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一
2021-04-11 16:06:48
121
原创 二叉树的最大深度
题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。解题思路:(1)深度优先搜索:斜体样式如果我们知道了左子树和右子树的最大深度 l和 r,那么该二叉树的最大深度即max(l,r)+1,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」
2021-04-11 12:06:47
301
原创 单值二叉树
题目描述:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例 1:输入:[1,1,1,1,1,null,1]输出:true示例 2:输入:[2,2,2,5,2]输出:false解题思路:递归遍历二叉树的节点,然后比较根节点与其左右孩子的值是否相同,相同返回true,不同返回false。代码实现:class Solution {public:bool isUnivalTree(TreeNode* r
2021-04-11 11:31:05
312
原创 最小栈
题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,nu
2021-04-04 22:29:28
115
原创 两个栈实现队列
题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, si
2021-04-04 20:11:39
198
原创 两个队列实现栈
题目描述:用两个队列实现一个栈,请实现他的两个函数Push 和 Pop,分别完成入栈和出栈功能。解题思路图:实现代码:#include #include #include using namespace std;template class Cstack {public:Cstack(){}~Cstack(){}void push(const T& val) {if (queue1.empty() && queue2.empty()) {queue1.
2021-03-30 21:38:13
115
原创 循环队列
题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。循环队列的实现代码:#includeusing namespace std;class CicleQueue{public://构造队列
2021-03-29 22:21:53
391
原创 链表插入排序
题目描述:对链表进行插入排序。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。解题思路:1.首先判断给定的链表是否为空,若为空,则不需要进行排序,直接返回。2.创建哑节点 dummyHead,令 dummyHead.next = head。引入哑节点是为了便于在 head 节点之前插入节点。3.维护 lastSorted
2021-03-18 09:33:53
78
原创 返回环形链表的第一个节点
题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。解题思路:一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希表可以很方便地实现。实现代码:clas
2021-03-18 08:40:15
149
原创 环形链表
题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解题思路:最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。具体地,
2021-03-17 22:17:48
96
原创 单词倒排
题目描述:说明:1、构成单词的字符只有26个大写或小写英文字母;2、非构成单词的字符均视为单词间隔符;3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;4、每个单词最长20个字母;输入描述:输入一行以空格来分隔的句子输出描述:输出句子的逆序示例1输入I//am??a\student输出student a am I解题思路:对于我们来说,有效的字符就是从‘A’~‘z’,当非有效字符的时候代表一个单词的结束。
2021-03-17 15:53:53
123
原创 骆驼命名法
题目描述:从C/C++转到Java的程序员,一开始最不习惯的就是变量命名方式的改变。C语言风格使用下划线分隔多个单词,例如“hello_world”;而Java则采用一种叫骆驼命名法的规则:除首个单词以外,所有单词的首字母大写,例如“helloWorld”。 请你帮可怜的程序员们自动转换变量名。输入描述: 输入包含多组数据。每组数据一行,包含一个C语言风格的变量名。每个变量名长度不超过100。输出描述: 对应每一组数据,输出变量名相应的骆驼命名法。输入例子: hello_worldnice_to_m
2021-03-17 15:14:07
335
转载 2021-03-16
题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例
2021-03-16 22:51:37
62
原创 转换成小写字母
题目描述:实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。示例 1:输入: “Hello”输出: “hello”示例 2:输入: “here”输出: “here”示例 3:输入: “LOVELY”输出: “lovely”实现代码:class Solution {public:string toLowerCase(string str) {string s="";for(int i=0;i<
2021-03-16 22:24:56
81
原创 找出两个链表中第一个相等节点
题目描述:编写一个程序,找到两个单链表相交的起始节点。解题思路:方法一: 暴力法对链表A中的每一个结点 i的值,遍历整个链表 B 并检查链表 B 中是否存在结点i的值相等。复杂度分析时间复杂度 : (mn)(mn)。空间复杂度 : O(1)O(1)。代码实现:class Solution {public:ListNode *getIntersectionNode(ListNode headA, ListNode headB) {ListNodeHa=headA;ListNodeHb
2021-03-16 13:56:03
604
原创 判断链表是否为回文结构
回文链表:是指链表对折起来,对应位置的元素相等题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true解题思路:1、利用快慢指针找到中间的位置(起初均指向头结点,然后slow一次走一步,fast一次走两步。注意不需要区分链表结点个数是奇数还是偶数); 2、将后半部分指针翻转;
2021-03-16 12:22:35
251
原创 删除链表中的重复节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入{1,2,3,3,4,4,5}返回值{1,2,5}代码实现:class Solution {public:ListNode* deleteDuplication(ListNode* pHead) {if (pHead == NULL || pHead
2021-03-14 11:15:25
158
原创 链表分割
题目描述:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针解题思路:(1)直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。(2)然后迭代访问整个链表,将元素插入before或者after链表末尾。一旦抵达链表末端,则表明拆分完毕,最后合并两个链表。代码实现:class Partition {public:ListNode* partition(Lis
2021-03-13 19:43:30
112
原创 按升序方式合并两个链表
题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]代码实现:方法一(递归):class Solution {public:ListNode* mergeTwoLists(ListNode* l1, List
2021-03-13 09:20:00
668
原创 输出该链表中倒数第k个结点。
题目描述:输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}代码实现:class Solution {public:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {//当链表为空且k=0时无效if(pListHeadNULL&&k0){return NULL;}ListNodeahead=pListHead;//从k-1节点出发的指针ListN
2021-03-12 16:31:26
120
原创 返回链表的中间节点
题目描述:给定一个头结点为 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.nex
2021-03-12 10:46:56
733
原创 反转链表
题目描述:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL代码实现:class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.nex
2021-03-11 22:51:18
66
原创 移除链表元素
题目描述:给你一个链表的头节点 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输出:[]提示:列表中的节点在范围 [0, 104] 内1 <= Node.val <= 5
2021-03-11 22:19:48
73
原创 剪绳子2020.12.24
题目描述:假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。示例 1:输入: flowerbed = [1,0,0,0,1], n = 1输出: True示例 2:输入: flowerbed = [1,0,0,0,1], n = 2输出: Fa
2020-12-25 15:18:37
78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人