【C++刷题集】-- day1

目录

选择题

单选

编程题

组队竞赛⭐

【题目解析】

【解题思路】(排序 + 贪心)

删除公共字符⭐

【题目解析】

【解题思路】(哈希映射)


选择题

单选

1、 以下for循环的执行次数是  ( )
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
是无限循环
循环次数不定
4次
3次
正确答案:

解析:

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

  • 初始化:为逗号表达式式,从左到右执行。
  • 条件判断:为逻辑与需同真为真,y = 123赋值表达式,返回值为所赋的值 (y = 123) && (x < 4) -> (123恒为真) && (x < 4)。
  • 调增x:0 -> 1 -> 2 -> 3。
  • 循环语句:空语句。

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

2、 以下程序的运行结果是  ( )
#include 
int main(void) {
	printf("%s , %5.3s\n", "computer", "computer");
	return 0;
}
computer , puter
computer ,    com
computer , computer
computer , compu.ter
正确答案:

解析:

  • %s遇见 '\0' 就停止打印。
  • %m.ns
    • m:输出字符串的宽度。
    • n:左起截取目标字符串n个字符。
      • 字符串长度 > n > m:此时m的作用失效,是只受n的控制。
      • m > n:是右对齐补空格。
      • n > 字符串长度:作用与%s一样。
----------------------------------------------

3、下列main()函数执行后的结果为 ( )

int func() {
	int i, j, k = 0;
	for (i = 0, j = -1; j = 0; i++, j++) {
		k++;
	}
	return k;
}
int main() {
	cout << (func());
	return 0;
}
-1
0
1
2
正确答案:

解析:

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

  • 初始化:为逗号表达式式,从左到右执行。
  • 条件判断:j = 0赋值表达式,返回值为所赋的值0恒为假。
  • 调增x:不执行。
  • 循环语句:不执行。

----------------------------------------------
4、
下面程序输出是什么?
#include 
int main()
{
	int a = 1, b = 2, c = 3, d = 0;
	if (a == 1 && b++ == 2)
		if (b != 2 || c-- != 3)
			printf("%d,%d,%d\n", a, b, c);
		else
			printf("%d,%d,%d\n", a, b, c);
	else
		printf("%d,%d,%d\n", a, b, c);
	return 0;
}
1,2,3
1,3,2
3,2,1
1,3,3
正确答案:

解析:

后置++、后置--:先使用再++ / --。如:b++ == 2,是先进行b == 2的判断,判断完再进行++。

前置++、前置--:先++ / --再使用。如:++b == 2,是先进行++,++完再进行b == 2的判断。

||逻辑判断:有真即真,所以第一个为真,第二个的状态就不重要了,于是编译器会优化,不执行第二个(短路原则)

&&逻辑判断:有假即假,所以第一个为假,第二个的状态就不重要了,于是编译器会优化,不执行第二个(短路原则)

----------------------------------------------
5、 若有定义语句:
int a=10; 
double b=3.14; 
则表达式 'A'+a+b 值的类型是  ( )
char
int
double
float
正确答案:

解析:

        不同类型的表达式进行计算的时候,会有自动提升的过程,也就是说表示范围小的类型会自动提升为表示范围大的类型。如上:char类型 + int类型 + double类型,最终经过整形提升和算数转换,最终提升类型double类型。

表达式求值( 整形提升 + 算术转换 )_川入的博客-CSDN博客

----------------------------------------------
6、
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};

中,p[1][2]的值是 ( )

1
0
6
2
正确答案:

解析:

        二维数组:行可省略,列不可省略,未进行初始化部分默认为0。

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

----------------------------------------------
7、 选择表达式 11|10 的结果 ( 本题数值均为十进制 )  ( )
11
10
8
2
正确答案:

解析:

11:0000 1011

10:0000 1010

11 | 10:0000 1011 = 11

( | 按位或:有1则1;& 按位或:有0则0)

----------------------------------------------
8、
int fun(int a) {
	a ^= (1 << 5) - 1;
	return a;
}
fun(21)运行结果是  ( )
10
5
3
8
正确答案:

解析:

a ^= b:a = a ^ b。

1 << 5:0010 0000 = 32 = 0001 1111。

a = (21)^(31):(0001 0101) ^ ( 0001 1111) = 1010 = 10。

^按位异或:异为1,同为0

----------------------------------------------
9、 若有定义语句:
int year=1009,*p=&year;
以下不能使变量 year 中的值增至 1010 的语句是  ( )
*p+=1;
(*p)++;
++(*p);
*p++;
正确答案:

解析:

优先级:( ) > 后置++ > 前置++ > * > +=

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

----------------------------------------------
10、 下面关于"指针"的描述不正确的是  ( )
当使用free释放掉一个指针内容后,指针变量的值被置为NULL。
32位系统下任何类型指针的长度都是4个字节。
指针的数据类型声明的是指针实际指向内容的数据类型。
野指针是指向未分配或者已经释放的内存地址。
正确答案:

解析:

free释放掉一个指针内容后,只是销毁了指针所指向的空间,并不会将指针置NULL,此时指针指向一个被销毁的空间 -- 野指针。

  • 常见的造成野指针的原因:
  1. 定义指针的时候为进行初始化。
  2. free释放掉指针后没有置NULL。
  3. 越界访问。

编程题

组队竞赛⭐

组队竞赛_牛客笔试题_牛客网 (nowcoder.com)


        牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i。现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人。牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
        一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
        一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
        一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。

【题目解析】

        队伍的水平值等于该队伍队员中第二高水平值,为了所有队伍的水平值总和最大的解法,也就是说每个队伍的第二个值是尽可能大的值所以实际值把最大值放到最右边,最小是放到最左边。

【解题思路】(排序 + 贪心)

  • 排序 + 贪心算法:贪心算法就是每次选值时都选当前能看到的局部最解忧,所以这里的贪心就是保证每组的第二个值取到能选择的最大值就可以,我们每次尽量取最大,而尽量取最大就是最大的次极大。
  • 例如:现在排序后有 1 2 5 5 8 9 ,那么分组为1 8 9 和 2 5 5。

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

        所以我们再排除最大的情况下取次大。

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

        于是中间值8最好,而左为小,越小越好。

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

         贪心算法:只看局部最优解。

【C++刷题集】-- day1_第7张图片

#include 
#include 
#include 
using namespace std;

int main() {
    int n = 0;
    cin >> n;
    vector val(3*n, 0);
    for (int i = 0; i < (3 * n); i++) cin >> val[i];

    // 排序
    sort(val.begin(), val.end());

    // 所有队伍的水平值总和最大值
    uint64_t ret = 0;

    // 贪心
    int right = 0;
    int left = val.size() - 1;
    for(;right < left; right++)
    {
        ret += val[left - 1];
        left -= 2;
    }
    
    cout << ret << endl;
    return 0;
}

删除公共字符

删除公共字符_牛客题霸_牛客网 (nowcoder.com)


输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

【题目解析】

        略

【解题思路】(哈希映射)

        如果使用传统的暴力查找方式,滚动两个字符串,效率为O(N^2)太低了,很难让人满意抛弃解法,采用哈希映射更好。

#include 
#include 
#include 
using namespace std;

int main() {
    string str;
    string sub;
    
    // 注意这里不能使用cin接收,因为cin遇到空格就结束了。
    // 使用string提供的getline
    getline(cin, str);
    getline(cin, sub);

    // 使用哈希映射思想统计str中字符的出现
    vector hashtable(256,0);
    for(int i = 0; i < sub.size(); i++) hashtable[sub[i]] = 1;

    // 这里就不采取erase的方式(需要移动),采取利用空间换时间。
    string str_ret;
    for(int i = 0; i < str.size(); i++)
    {
        if(hashtable[str[i]] == 1)
            continue;
        str_ret.push_back(str[i]);
    }
    cout << str_ret << endl;
}

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