寒假作业Day 13
一、选择题
答案选C,3个,很简单
a,b入栈,b出栈;c,d入栈,再出栈;e,f同理;a再出栈,g入栈再出栈
所以进栈最多的时候是3个元素
已知一个栈的入栈序列是连续的整数1到n,且已知第二个出栈的元素是3。这意味着在3出栈之前,2必须已经入栈但还未出栈。因此,在3出栈后,紧接着1和2也必须依次出栈,以满足题目条件。在此之后,栈为空,剩下的元素4到n可以按任意顺序入栈和出栈。所以,第三个出栈的元素p 3 可以是4到n中的任意一个,共有n−3种可能。
3、已知栈 S 的初始状态为空,元素 a,b,c,d,e,f 依次入栈 S ,出栈的序列为 b,d,c,f,e,a 则栈S的容量至少为( )
A. 6 B. 5 C. 4 D. 3
首先a和b入栈,b出栈;c和d入栈,并出栈;e和f入栈,并出栈;a出栈;由此可知,S的容量在c和d入栈或者e和f入栈的时候最大,所以栈的容量至少为3
4、假设以数组A[60]存放循环队列的元素,其头指针是front=47,当前队列有50个元素,则队列的尾指针值为( )
A.3 B.37 C.97 D.50
在循环队列中,头指针 front 和尾指针 rear 是用来指示队列中元素的起始位置和结束位置的。循环队列的特性是当指针到达数组的末尾时,它会回到数组的开头。
已知数组 A[60],头指针 front = 47,当前队列有 50 个元素。
首先,我们需要计算队列中从 front 到数组末尾的空闲空间。由于数组大小为 60,从头指针 front = 47 到数组末尾的空闲空间是 60 - 47 = 13。
然后,由于队列中有 50 个元素,而末尾的空闲空间只有 13,这意味着尾指针 rear 必须从数组的开头开始,并向后移动 50 - 13 = 37 个位置。
因此,尾指针 rear 的位置是 37。
5、若用一个大小为 6 的数组来实现循环队列,且当 rear 和 front 的值分别为 0 和 3 。当从队列中删除一个元素,再加入两个元素后,rear 和 front 的值分别为( )
A.1和5 B.2和4 C.4和2 D.5和1
删除1个元素,front从3移动到4;加入两个元素,rear从0移动到2;故答案为2和4
二、编程题
char* makeGood(char* s) {
int i = 0, j;
for (j = 1; j < strlen(s); j++) {
if (i == -1 || s[i] + 32 != s[j] && s[i] - 32 != s[j]) {
s[++i] = s[j];
}
else {
i--;
}
}
s[++i] = '\0';
return s;
}
我们拿abBAcC来举个例子,一开始i=0,j=1,ab满足条件,所以i=1,j=1,s[1]=s[1];i=1,j=2,bB是不满足的,i–为0;i=0,j=3,aA不满足,所以i–为-1;i=-1,j=4,满足条件,s[0]=s[4],即a变为c;i=0,j=5,cC不满足,i–为-1,j走到尽头;所以s[0]变为\0结束符,即把s变成了空数组
原理大家可以自己分析一下
//递归给每个节点的color赋值,但也跟节点本身的值有关
void col(struct TreeNode* node,bool* color){
color[node->val]=true;
if(node->left)
col(node->left,color);
if(node->right)
col(node->right,color);
}
//主要用来算返回值的函数
int numColor(struct TreeNode* root){
bool* color=(bool*)calloc(1,sizeof(bool)*1001);//将所有元素初始化为0(false)
int ans=0;
col(root,color);//color数组赋值
for(int i=0;i<1001;i++){
if(color[i])
++ans;//如果这个是true,那么就让计数器+1,并且就算一个i出现好多次,也只会定义一次true
}
return ans;
}
这两个函数的意思是:col函数首先利用递归,遍历二叉树,给color数组的空间赋值,这是用在算返回值的函数中的;在下面的函数中,我们首先创建一个color函数,并将其值全部初始化为false;
创建计数器,用col函数赋值,然后在for循环中,如果之前给这个color[i]赋过值,那么计数器就增加,最后return 计数器中的值