【C++刷题集】-- day3

目录

选择题

单选

OR59 字符串中找出连续最长的数字串⭐

【题目解析】

【解题思路】

JZ39 数组中出现次数超过一半的数字⭐

【题目解析】

【解题思路1】

【解题思路2】


选择题

单选

1、以下程序的输出结果是 ( )

#include 
int main()
{
	char a[10] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 0 }, * p;
	int i;
	i = 8;
	p = a + i;
	printf("%s\n", p - 3);
    return 0;
}
6
6789
'6'
789

正确答案:


解析:

【C++刷题集】-- day3_第1张图片

  • %s:格式化打印是遇见 '\0'(0) 才会停止打印。

----------------------------------------------

2、以下程序的输出结果是 ( )

#include 
using namespace std;
int main()
{
	int x = 3, y = 3;
	switch (x % 2)
	{
	case 1:
		switch (y)
		{
		case 0:
			cout << "first";
		case 1:
			cout << "second";
			break;
		default:
			cout << "hello";
		}
	case 2:
		cout << "third";
	}
	return 0;
}
second third
hello
first second
hellothird

正确答案:


解析:

        根据x % 2 = 1匹配 case 1: ,根据y = 3匹配 default: ,于是会打印 "hello" 。但是此处我们需要注意,外层的switch语句的case : 是没有 break; 语句的,所以其会继续向下执行,然后执行case 2: ,再打印 "third" 。

        没有 break; 语句会一直执行到 break; 语句为止 / 结束。

----------------------------------------------

3、 以下能对二维数组a进行正确初始化的语句是 ( )
int a[2][] = {{0,1,2},{3,4,5}};
int a[][3] = {{0,1,2},{3,4,5}};
int a[2][4] = {{0,1,2},{3,4},{5}};
int a[][3] = {{0,,2},{},{3,4,5}};

正确答案:


解析:

二维数组再声明的时候,行可以省略,列是不可以省略的。

:声明的是两行,但是初始化的时候,初始化的是三行。

:初始化每一行的时候,必须连续的初始化,中间不能间隔。

----------------------------------------------

4、 能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是 ( ) 
return这二个数
形参用数组
形参用二个指针
用二个全局变量

正确答案:


解析:

return 每一次只能 return 一个数据类型,多个除非放到一个数组 / 一个容器里面。

用数组的话,在调用这个函数的时候需要传递数组的地址,然后将函数处理的结果,放到这个数组中,然后函数调用完之后,就可以通过主调函数去访问数组来获取处理结果。

用指针的话,在调用这个函数的时候需要传递两个地址变量,然后将对应的处理结果,放到地址的所属空间中,然后在函数调用完之后,主调函数通过两个指针去访问所属空间的值。

全局变量的作用域是在整个源文件都是有效的,所以主调函数可以对其访问,以获取处理结果。

----------------------------------------------

5、 int *p[4] 与选择项中的 ( ) 等价
int p[4]
int *p
int *(p[4])
int (*p)[4]

正确答案:


解析:

  • 题int *p[4]:[]的优先级是高于*的,所以p先和[]进行结合表示其是一个数组,然后数组里面存储的是int类型的指针 —— int类型的指针数组,元素个数为4

int p[4]:int类型的数组,元素个数为4

int *p:int类型的指针数组

int *(p[4]):此时[]的优先级是高于*的,int类型的指针数组,元素个数为4

int (*p)[4]:此时*的优先级是高于[]的,数组指针,元素个数为4,int类型

----------------------------------------------

6、 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
n=0; while(ch=getchar()!='\n') n++;
n=0; while(getchar()!='\n') n++;
for(n=0; getchar()!='\n'; n++);
n=0; for(ch=getchar(); ch!='\n'; n++);

正确答案:


解析:

while(ch=getchar()!='\n'):先getchar()获取一个字符,然后由于 != 优先级高于 '\n' ,所以,先进行 getchar()!='\n' 后再执行 ch = (getchar()!='\n'),虽然ch存在很奇怪,但是能计算。

操作符优先级(详细说明+表格+问题表达式)_川入的博客-CSDN博客

while(getchar()!='\n'):的简易版,能实现。

for(n=0; getchar()!='\n'; n++):getchar()!='\n' 作为判断条件,此可以理解为与效果一样,能实现。

for(ch=getchar(); ch!='\n'; n++):ch=getchar() 作为初始化部分,只有最开始的时候才会执行一次,所以是无法实现的,并且如果输入的第一个字符不是 '\n' 将会死循环。

----------------------------------------------

7、 以下代码
char* ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;
代码执行之后ptr指向的内容是?
Compiler error
fg
efg
defg

正确答案:


解析:

【C++刷题集】-- day3_第2张图片

        因为p指向的类型是char类型的。

----------------------------------------------

8、 下面3段程序代码的效果一样吗()
int b;
(1)const int* a = &b;
(2)int const* a = &b;
(3)int* const a = &b;
(2)=(3)
(1)=(3)
(1)=(2)
都不一样

正确答案:


解析:

  • 常量指针:指针所指空间的值是不能发生改变的,不能通过指针解引用修改指针所指向的空间的值,但是指针的指向是可以发生改变的。
  • 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值是可以发生的,可以通过指针解引用改变指针所指空间的值。
  • 区分:const与*的相对位置
    • const在*的左边 -- 常量指针
    • const在*的右边 -- 指针常量

(1)常量指针

(2)常量指针

(3)指针常量

----------------------------------------------

9、 32位系统中,定义int**a[3][4],则变量占用内存空间为()。
4
48
192
12

正确答案:


解析

        三行四列的一个数组,一共有 3 * 4 = 12 个元素。每一个元素都是int的二位指针类型,指针类型在32位系统中,是4个字节,于是:12 * 4 = 48。

----------------------------------------------

10、 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
#include 
int main() {
	long long a = 1, b = 2, c = 3;
	printf("%d %d %d\n", a, b, c);
	return 0;
}
1,2,3
1,0,2
1,3,2
3,2,1

正确答案:


解析:

  • 大端:低位存高地址,高位存低地址。
  • 小段:高位存高地址,低位存低地址。

 C语言整数存储_大小端_川入的博客-CSDN博客

【C++刷题集】-- day3_第3张图片

看题:

        long long类型是占8个字节,32 位 little endian 的机器。

【C++刷题集】-- day3_第4张图片

        利用printf函数打印这三个变量的值,printf是一个库函数,在调用的时候,会创建一个函数栈帧。(栈:高地址向低地址增长)

        调用printf函数的时候,变量是从右到左入栈的(先c,再b,再a)。

        然后利用 %d 进行打印,每次获取4个字节内存的数据,然后根据后进先出的原则,依次向后4个字节,以转化为十进制打印。

        所以输出为:1 0 2

----------------------------------------------

OR59 字符串中找出连续最长的数字串

字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com)

【C++刷题集】-- day3_第5张图片

【题目解析】

        本题是一个很简单的题目,这里就不解析了。

【解题思路】

        遍历字符串,使用str_tmp临时记录出现的数字片段,使用str_ret记录str_tmp临时出现的最长数字片段,最后返回str_ret。
#include 
#include 
using namespace std;

int main() {
    string str;
    cin >> str;
    string str_ret;
    string str_tmp;
    for(auto ch : str)
    {
        if(ch <= '9' && ch >= '0')
            str_tmp.push_back(ch);
        else
        {
            if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;
            str_tmp.clear();
        }
    }
    if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;
    cout << str_ret << endl;
}

JZ39 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网 (nowcoder.com)

【C++刷题集】-- day3_第6张图片

【题目解析】

        本题题意很简单,需要找出超过一半的那个数字,需要注意这个题是一个往年面试的热门题型。

【解题思路1】

        数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优。
class Solution {
public:
    int MoreThanHalfNum_Solution(vector numbers) {
        if(numbers.empty()) return 0;
        sort(numbers.begin(), numbers.end());
        return numbers[numbers.size() / 2];
    }
};

【解题思路2】

        众数:就是出现次数超过数组长度一半的那个数字,如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。
class Solution {
  public:
    int MoreThanHalfNum_Solution(vector numbers) {
        int result = numbers[0];
        int times = 1;
        int i = 1;
        for (int i = 1; i < numbers.size(); ++i)
        {
            if (times != 0)
            {
                if (numbers[i] == result) // 相同记录个数
                    ++times;
                else // 不同消
                    --times;
            } 
            else // 前面的数全部消完,需要重新挨着再拿出一个数做标准
            {
                result = numbers[i];
                times = 1;
            }
        }
        return result;
    }
};

/

你可能感兴趣的:(C++刷题集,c++,c语言,算法)