c++ inktasdh

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第N天,点击查看活动详情 💦第一题 💦第七题 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()

A int *a[10]; B int (*a)[10]; C int (*a)(int); D int (*a[10])(int);

A选项[]的优先级高于*,所以表面这是一个数组,数组里面存放的是int类型的指针,是一个指针数组

B是一个数组指针,指向int类型的数组,大小为10

C是一个指针函数,这个函数有一个int参数,返回值类型是int

D是函数指针数组,有一个整形参数并返回一个int类型的值,满足题意

这道题的答案是D

💦第八题 以下 C++ 函数的功能是统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为()

void AlphabetCounting(char a[], int n) { int count[26] = {}, i, kind = 10; for (i = 0; i < n; ++i) _________________; for (i = 0; i < 26; ++i) { printf("%c=%d", _____, _____); } } 1 2 3 4 5 6 7 8 9 10 A ++count[a[i]-‘Z’] ‘Z’-i count[‘Z’-i]

B ++count[‘A’-a[i]] ‘A’+i count[i]

C ++count[i] i count[i]

D ++count[‘Z’-a[i]] ‘Z’-i count[I]

先看A选项,a[i] - ‘Z’ 的ASCII值是小于0的,但是数组下标不能小于0,所以A是错误的

B选项和A同理,‘A’ - a[i]的ASCII值也是小于0

C选项用i做下标,但是i的值是取决于n的,所以这个字符数组有可能是比count记录的大的,所以不满足题意,会出现越界,所以c是错的

D选项就是每一个下标对应一个字母,所以可以用来统计字数,‘Z’ - i ,是对应的每个字母,count[i]存储的是每个字母出现的次数,所以D是对的

所以这道题的答案是D

💦第九题 在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

struct A{ unsigned a : 19; unsigned b : 11; unsigned c : 4; unsigned d : 29; char index; }; 1 2 3 4 5 6 7 则sizeof(struct A)的值为()

A 9 B 12 C 16 D 20

这道题的:数字表示位断,假设开辟4个字节,32个比特位,a占19个字节,如果b的位置够的话还是会放在这四个字节里面,不需要重新开辟空间。

根据内存对齐原则,所以得到这个结构体的长度为16字节

所以这道题的答案是16,选C

💦第十题 下面代码会输出()

int main() { int a[4]={1,2,3,4}; int ptr=(int)(&a+1); printf("%d",*(ptr-1)); } 1 2 3 4 5 6 A 4 B 1 C 2 D 3

这道题给了一个整形数组,定义了一个指针ptr,利用数组给他赋值,&a + 1 会偏移数组类型个大小,即从数组首元素偏移4位,指向最后一个数据的下一个位置,所以*(ptr-1)指向的是数组的最后一个位置

所以这道题的答案是4,选A

编程题 🔥第一题 链接:排序子序列

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列. 如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

解题思路; 首先子序列是非递增或是非递减的: 递增:1 2 3 4 5 6 递减:6 5 4 3 2 1 非递增:6 5 5 4 3 (前后两数可能相等) 非递减:1 2 2 3 4 (前后两数可能相等)

对数组a而言,就可以分为一下三种情况: if (a[i] > a[i+1]) //即将进入非递增序列 if (a[i] == a[i+1] //相等时 if (a[i] < a[i+1]) //即将进入非递减序列

输入数组之后,开始遍历数组,如果数组满足非递增或者非递减,就进入对应的条件判断,然后此时如果i+1的元素依然满足对应的非递增或非递减,就直接i++,然后跳出之后进行count++,这就是一个排序子序列,如果相等的话就直接i++,这样执行下去,直到遍历结束,输出此时的count。

代码演示: #include #include using namespace std;

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 🔥第二题 链接:字符串倒置

解题思路 先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string

代码演示

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 取巧思路 直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了

#include #include using namespace std; // cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出 int main() { string s1, s2; cin >> s2;