- 博客(42)
- 收藏
- 关注
原创 from sys import argv
sys 为内置模块,提供了许多函数和变量来处理 Python 运行时环境的不同部分。是固定的用法,不能自己随便写名字代替它,这行的作用就是要把用到的东西(比如需要什么特定函数什么之类的)从这个东西存放的模块中引入程序中。就好比C语言中的strlen()函数、strcat()函数(、strcmp()函数等等,需要写入头文件#include<string.h>预处理命令。经过预处理后,这几个函数才能用。argv就是列表(参数变量),是编程术语。在解释器启动后, argv 列表包含了传递给脚本
2021-10-17 22:26:02
423
原创 lesson 21 按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间
思路:套用删除最小值的模版,加一个输出语句即可。代码:void increasePrint(LNode* &L){ while(L->next){//循环到只剩头结点,别忘了这句!!! LNode *p=L->next,*pre=L; LNode *minp=p,*minpre=pre; while(p){ if(p->data<minp->data){
2020-09-29 07:34:08
1116
原创 lesson20 有一个带头结点的单链表L,设计一个算法使其元素递增有序。
思想:直接插入排序算法代码:void sort(LinkList * &L){ LinkList *p,*pre,*r; p = L->next->next; // 先保存下L的第二个元素,因为下一步要将L变成只有一个元素的有序表; p指针用来遍历无序区 L->next->next = NULL; // 将L变成只有一个元素的有序表 // 从L的第二个元素开始遍历整个L直至表尾 while(p != NULL){ r = p->next
2020-09-27 22:36:14
3826
原创 lesson19-3 以孩子兄弟链表为存储结构,请设计递归和非递归算法求树的深度
思路:firstchild对应lchildnextsibling对应rchild其他操作和普通二叉树的操作一样代码:int getHeight(BTNode *t){//递归算法 if(!t) return 0; int hc=getHeight(t->firstchild); int hs=getHeight(t->nextsibling); return (hc+1)>hs?hc+1:hs;}int getHeight_(BTNode *t){/
2020-08-23 19:49:02
956
原创 lesson19-2 《数据结构与算法》P35Q36拆分单链表
题目描述:编写算法将单链表L1拆成两个表,其中以L1为头的链表保持原来向后的链接,另一个以L2为头的链表,其链接方向与L1相反,L1包含原链表的奇数序号结点,L2包含原链表的偶数序号结点。思路:对一个链表进行部分逆置或其他操作时,可以用 i 来保存结点的序号,更简便。代码:void breakList(LNode *L1){ int i=0;//i表示结点序号 LNode *L2=new LNode();//L2为偶数序号链表,L1为奇序号链表 L2->next=NULL;
2020-08-23 19:45:46
830
原创 lesson19-1 写作业的学生人数
题目描述:在既定时间做作业的学生人数给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。代码://querytime介于开始时
2020-08-23 19:39:59
96
原创 lesson18-3 计算二叉树的WPL。
思路:递归思想,先序遍历框架。代码:int WPL=0;int preOrder(BTNode *root,int level){//先序遍历框架 if(root){ if(root->left==NULL&&root->right==NULL)//如果是叶结点,累计WPL WPL+=level*root->weight; if(root->left!=NULL) preOrder(root->left,level+1);
2020-08-21 22:16:05
736
原创 lesson18-2 《数据结构与算法》P37Q58
题目描述:设有一个正整数序列组成的有序单链表(按递增次序有序),完成下列功能。(要求用最少的时间和最小的空间)(1)确定在序列中比正整数x大的数有几个,相同的数只计算一次。(2)在单链表中将比正整数x小的数按递减次序排列(3)将比正整数x大的偶数从单链表中删除。...
2020-08-21 22:12:28
793
原创 lesson18-1 杨辉三角
题目描述:二项式展开式的系数为C(n,0)=1,C(n,n)=1,对于n0C(n,k)=C(n-1,k)+C(n-1,k-1),对于0<k<n其形成著名的杨辉三角。(1)试写一个递归算法,根据上式生成C(n,k).(2)试写一个非递归算法,既不用数组也不用栈,对于任意的0kn,计算C(n,k)...
2020-08-21 19:28:03
112
原创 lesson17-4 孩子分糖果
题目描述:给你一个数组candies和一个整数extraCandies,其中candies[i]代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的extraCandies个糖果分配给孩子们之后,此孩子有 最多的糖果。注意,允许有多个孩子同时拥有 最多的糖果数目。思想:贪心算法。代码:void getMaxCandies(int candies[],int extra,int length){ char res[MAXSIZE]={};...
2020-08-21 19:19:50
130
原创 lesson17-3 合并二叉树
题目描述:给定两个二叉树,想象当将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路1:将两棵树合并到第一棵树上,破坏原来的树。代码1://先序模板BTNode* mergeBitree(BTNode *t1,BTNode *t2){ if(t1==NULL) return t2; if(t2==NULL)
2020-08-21 19:17:05
170
原创 lesson17-2 《数据结构与算法》P37Q55
题目描述:设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:(1)找出最小值结点,且打印该数值。(2)若该数值是奇数,则将其与直接后继结点的数值交换。(3)若该数值是偶数,则将其直接后继结点删除。代码:void swapOrDelete_(LNode *L){//函数分解思想 LNode* min=findMinNode(L);//不知道最小值data是哪个节点 => 我去拿这个节点=>函数要返回一个结点的指针 if(min==NULL){ co
2020-08-21 19:11:53
759
原创 lesson17-1 返回数组中两个最大数值的乘积
题目描述:给出一个整数数组 nums,请选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你算并返回该式的最大值,其中nums[i]为正数(最好使用两种思路方法来完成)思路1:将整个数组按照递增有序进行排序,拿到第一大和第二大的数。思路2:直接找到最大的两个数。代码1:int getMaxValue1(int nums[],int length){//将数组进行递增有序排序,返回最大值与第二大值的乘积 bubbleS.
2020-08-21 19:03:20
350
原创 lesson10-1 实现冒泡算法
代码:void bubbleSort(int a[],int length){ int flag; for(int i=length-1;i>=1;--i){ flag=0; for(int j=1;j<=i;j++){ if(a[j-1]>a[j]){ swap(a[j-1],a[j]); flag=1; } } } if(flag==0) return;}void swap(int &a,int &b){
2020-08-19 11:14:05
97
原创 lesson14-1 买入股票的最佳时机
题目描述:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5
2020-08-19 11:10:18
121
原创 lesson16-1 桌上有 n 堆硬币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有硬币的最少次数。
代码1:int getMinCount(int coins[],int length){ int res=0; for(int i=0;i<length;i++){ res+=(coins[i]+1)/2; } return res;}代码2:int getMinCount1(int coins[],int length){ int res=0; for(int i=0;i<length;i++){ if(coins[i]%2!=0) res+=coi
2020-08-16 18:13:29
1628
原创 lesson16-3 给定一个二叉树,计算整个树的坡度。 一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。 整个树的坡度就是其所有节点的坡度之和
题目描述:给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。思路:求结点和左右子树的累和值,后续遍历框架,顺便求出坡度代码:int getIncline(BTNode *t){ if(!t) return 0; int sum=0; calcTilt(t,&sum); return sum;}int calcTilt(BTNode *t,
2020-08-16 18:06:39
277
原创 lesson16-1 《算法与数据结构》P35Q40
题目描述:线性表中元素递增有序且按顺序存储与计算机内。要求设计一算法完成:(1)用最少时间在表中查找数值为x的元素(2)若找到将其与后继元素位置交换(3)若找不到,将其插入表中并使表中元素仍递增有序思路:用二分查找法进行查找,时间复杂度为O(logn)。代码:int flag=0;//默认没找到元素xvoid swapOrInsert(int a[],int &length,int low,int high,int x){ int index=halfSe.
2020-08-16 17:39:18
167
原创 lesson15-3 给定一棵二叉搜索树,请找出其中第k大的结点。
思路:用RTL(右子树→根结点→左子树)的遍历方法,得到一个递减有序的序列,第K-1个数据元素即为第k大的结点。或者用中序遍历,得到一个递增序列,输出第 length-k+1 个数据元素即为第k大的结点。代码:int arr[MAXSIZE]={};//全局变量,创建数组接收递减序列int length=0;int searchKthNode(BTNode *t,int k){ traversal(t); return arr[--k];}void traversal(BT
2020-08-14 18:55:41
227
原创 lesson15-2 实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定只能访问该节点。
思路:在无法得到前驱结点的情况下删除某个指定结点,将后继结点的值赋给要删除的结点,然后删除这个后继元素即可。这也是一种删除方法,但用的少。代码:void deleteNode(LNode*&p){//待删除结点p LNode *q=p->next; p->data=q->data; p->next=q->next; free(q);}测试:#include<stdio.h>#include <stdlib.h&g
2020-08-14 18:48:58
438
原创 lesson15-1 动态和
题目:给出一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。输入:nums = [1,2,3,4]输出:[1,3,6,10]解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。代码:void runningSum(int nums[],int i){//只需要处理核心逻辑问题,不去关心非逻辑问题,比如输出之类的。 for(int j=1;j<i;j+
2020-08-14 18:43:18
149
原创 lesson6-2 设计一个函数,可以取出链表A和链表B的公共元素
思路:两次循环,先去遍历链表A中的每个元素,然后拿这个元素去遍历链表B,如果相同,就插入链表C中代码:void getIntersection(LNode *A,LNode *B,LNode *&C){//不妨设数据元素类型为int //1.创建头结点 C=(LNode*)malloc(sizeof(LNode)); C->next=NULL; //2.p是用来遍历链表A,t是用来记录C链表的末尾 LNode *p,*t; t=C; p=A->ne.
2020-08-13 18:48:49
144
原创 lesson7-2 有一个表头为first的单链表,设计一个算法,通过遍历一趟链表,将链表中所有结点按逆序链接
思路:头插法建立一个新表。*表头为first就是链表的第一个结点,无论这个单链表带不带头结点。代码:void reverse(LNode *first){//不妨令链表带头结点 LNode *p=first->next; LNode *q=p->next; first->next=NULL; while(p){ p->next=first->next; first->next=p; p=q; if(q) q=q->ne
2020-08-13 17:34:38
1658
原创 lesson8-2 设计一个函数,可以判断链表B是不是链表A的子集
思路:两个链表都从第一个结点开始,如果对应数据相等,同时后移指针,直至到B链表表尾。如果对应元素不相等,A链表从上次比较结点后续开始继续遍历,B链表从第一个节点开始。A链表到表尾,B链表没到尾表示B链表不是A链表的子集,反之。代码:bool pattern(LNode *A,LNode *B){//考虑头结点问题 LNode *p=A; LNode *pre=p; LNode *q=B; while(p&&q){ if(p->data==q-&.
2020-08-13 17:27:41
689
原创 lesson10-2 删除单链表中值为x的结点
题目:链表L中可能存在一个值为x的结点,设计一个函数,删除这个可能存在的结点。代码:void searchAnddelete(LNode *L,int x){//假设单链表带头结点 LNode *pre=L,*p=L->next,*q; while(p){ if(p->data==x){ q=p; p=p->next; pre->next=p; free(q); } else{ pre=p; p=p->next
2020-08-13 17:16:16
994
原创 lesson 14-2 单链表查找倒数第k个结点
题目描述:已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0.思路:定义两个指针p和q,指针p用来遍历整个链表,指针q刚开始指向链表第一个元素;当p走了k-1步后,q开始走,当p走到表尾时,p所指的恰为倒数第k个结点。代码:int getNode(LNode *list,int k){
2020-08-13 16:38:20
215
原创 lesson 14-3 二叉树用二叉链表存储,设计一个算法,判断两棵二叉树结构是否相同
思路:结构相同就是左右子树结构都相同,不用考虑数据元素内容是否相同三种情况:(1)两棵树都空,返回真(2)一棵空,一棵不空,假(3)如果两棵树都非空,递归判断左右子树结构是否相同代码:bool isSameStructrue(BTNode *t,BTNode *p){ if(t==NULL&&p==NULL)//两棵树都空,结构相同,返回true return true; else if(t==NULL||p==NULL)//一棵树空,一棵树不空,结构
2020-08-09 20:09:28
4834
原创 lesson13-3 二叉树采用二叉链表的存储结构,设计一个算法可以求出给定值x的结点层号
代码1:void getLevel(BTNode *t,int level,char x,int *p)//用level记录当前访问层数,用p记录结点所在层数;{ if(t) { level++; if(t->data==x) { *p=level; } getLevel(t->lchild,level,x,p); getLevel(t->rchi
2020-08-07 22:59:25
2748
2
原创 lesson9-2 设计一个函数,将单链表的最大元素放置到链表表头(带头结点)
思想:本质是一个查找,删除和插入的问题用p从头至尾扫描单链表,pre指向*p的前驱;用max保存值最大的结点,maxpre指向max结点的前驱(用来保存max结点的前驱结点);一边扫描一边比较。void moveMaxNode(LNode *L){ LNode *pre=L,*p=pre->next,*max=p,*maxpre=pre; while(p){ if(p->data>max->data){ max=p; maxpre=pre; .
2020-08-07 22:49:25
407
原创 lesson9-3 给你一个数组,创建二叉树
题干:二叉链表存储结构如下:typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild;}BiNode,*BiTree;算法声明如下,请用递归思想完成该算法BiTree create(ElemType A[],int i){ ....}思想:正常创建即可函数:BiTree creat...
2020-08-07 22:49:16
179
原创 lesson9-1 快速排序 (一次遍历)
void partition(int arr[],int n){ int temp=arr[0]; int i=0,j=n-1; while(i<j){ while(i<j&&arr[j]>=temp) --j; if(i<j) //当arr[j]<temp时,跳出while循环,用arr[j]的值覆盖arr[i] arr[i++]=arr[j];//等价于arr[i]=arr[j]; i++; w...
2020-08-07 22:48:57
165
原创 lesson8-3 用二叉链表存储二叉树,编写递归算法,将二叉树的所有结点左右子树互换
思想:1、先写递归交换函数2、再写一个交换两个树结点的函数函数:void swap(BTNode *t){ if(!t) return; swap(t->lchild); swap(t->rchild); swapNode(t->lchild,t->rchild);}//交换两个树结点//只要是交换的题,就套用这个函数void swapNode(BTNode *&p,BTNode *&q){ BTNode *temp;.
2020-08-07 22:48:19
4470
原创 lesson11-1 设计一个算法,可以删除顺序表中所有值为x的元素
思路1:不创建新的数组,将数组中值不为x的元素,覆盖原来值为x的元素。代码1:void searchAndDelete(int arr[],int x,int &length){ int count=0;//用count来记录数组中不等于x的元素的个数 for(int i=0;i<length;i++){ if(arr[i]!=x){ arr[count++]=arr[i]; } } length=count;}思路2:创建一个新的数组,将值不为x
2020-08-07 22:48:04
2976
原创 lesson11-2 设计一个算法,可以删除单链表中所有值为x的结点
思路1:假设单链表带头结点,尾插法新建一个单链表,将值不等于x的元素存放在其中。代码1:void delAllSame(LNode *&L,int x){//用尾插法建立一个新的单链表,将值不为x的元素链接到表尾 LNode *p=L->next,*r=L,*q;//假设单链表带头结点,p指针用来扫描整个链表,r指针初值为头结点,之后始终指向表尾 while(p){ if(p->data!=x){ r->next=p; r=p; p=p-&g
2020-08-07 22:47:47
3300
原创 链表测试
函数头:#include<stdio.h>#include <stdlib.h>#include<math.h> //数学函数,求平方根、三角函数、对数函数、指数函数... #define MAXSIZE 15//用于使用c++的输出语句#include<iostream>using namespace std;结构体定义:typedef struct LNode{ int data; struct LNode *next;
2020-08-07 22:46:46
178
原创 lesson11-3 用二叉链表存储结构表示一颗二叉树,设计一个算法,求二叉树的高度
思路1:非递归,用层次遍历算法求二叉树的高度关键:1、last指针何时指向下一层代码1:int getBiTreeDepth(BTNode *t){ //1.创建队列 2.初始化工作=>根节点入队 BTNode *que[MAXSIZE]; int front=-1,rear=-1;//front和rear指针必须是负1,否则front和last永远都不能相遇 int level=0,last=0;//last指针始终指向当前层的最右结点 rear=(rear+1)
2020-08-07 22:46:30
1951
原创 树
函数头:#include<stdio.h>#include <stdlib.h>#include<math.h> //数学函数,求平方根、三角函数、对数函数、指数函数...//用于使用c++的输出语句#include<iostream>using namespace std;二叉树结构体定义:90%情况下用这个:typedef struct BTNode { char data; struct BTNode *lch
2020-08-07 22:46:17
112
原创 lesson 12-1 设计一个算法,找出1000以内的所有完美数
思路:完美数是指一个数是除了自身之外的因子的和。代码:bool isPerfectNum(int num){ int sum=0; for(int i=1;i<num-1;i++){ if(num%i==0){ sum=sum+i; } } return sum==num?true:false; }测试:#include<stdio.h>#include <stdlib.h>#include<math.h> //
2020-08-07 22:45:31
367
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人