【基础训练 || Test-1】

在这里插入图片描述

总言

  主要内容:一些习题。
  
  

  
  

一、选择

1、for循环、操作符(逗号表达式)

  以下for循环的执行次数是()

for (int x = 0, y = 0; (y = 123) && (x < 4); x++);

A 是无限循环
B 循环次数不定
C 4次
D 3

  相关知识链接:操作符详解

回答:4

在这里插入图片描述

  
  
  
  

2、格式化输出(转换说明符)

  以下程序的运行结果是()

#include <stdio.h>
int main(void) {
	printf("%s , %5.3s\n", "computer", "computer");
	return 0;
}

A computer ,   puter
B computer ,   com
C computer ,   computer
D computer ,   compu.ter

  

回答:computer ,   com

  相关说明:
  
在这里插入图片描述

在这里插入图片描述

  
  
  
  

3、for循环、操作符(逗号表达式、赋值和判等)

  下列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;
}

A -1
B 0
C 1
D 2

  相关链接:for循环表达式

回答:i=j=k=0;

在这里插入图片描述

  
  
  
  

4、if语句、操作符(自增自减、判等)

  下面程序输出是什么?

#include <stdio.h>
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;
}

A 123
B 132
C 321
D 133

  考察:
  ①if语句中,else匹配原则:相关链接
  ②逻辑运算符中的短路现象:相关链接

回答:a=1 b=3 c=3(短路) d=0

在这里插入图片描述

  
  
  
  

5、表达式求值(类型转换)

  若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()

A char
B int
C double
D float

  考察了隐式类型转换(整型提升、算术转换):相关链接

回答:C

以下为寻常算术转换:(自下向上转换)
long double
double
float
unsigned long int
long int
unsigned int
int

  
  
  
  

6、二维数组(数组初始化)

  下述p[1][2]的值是()

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

A 1
B 0
C 6
D 2

  考察了二维数组的创建与初始化:相关链接

回答:0。四行四列,行可以省略时花括号区分,值不够时默认为0

在这里插入图片描述

  
  
  
  

7、位操作符(按位或与非)

  选择表达式 11|10 的结果(本题数值均为十进制)()

A 11
B 10
C 8
D 2

  相关链接

回答:11

  
  
  
  

8、位移操作符、位操作符

  fun(21)运行结果是()

int fun(int a) {
	a ^= (1 << 5) - 1;
	return a;
}

A 10
B 5
C 3
D 8

  相关链接

回答:10

  
  
  
  

9、运算符优先级

  如下述定义语句,不能使变量 year 中的值增至 1010 的语句是()

int year=1009,*p=&year;

A *p+=1;
B (*p)++;
C ++(*p);
D *p++;

  主要考察前置自增、后置自增、解引用操作符优先级相关链接

回答:D。

在这里插入图片描述

  
  
  
  

10、 指针概念理解

  下面关于"指针"的描述不正确的是()

A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
A

  解释:实际上,使用 free() 函数释放一个指针所指向的内存时,指针本身的值并不会被自动置为 NULL。free() 只负责释放内存,而不会修改指针的值。 因此,指针仍然会指向之前分配的内存地址,但这个地址现在可能已经被操作系统用于其他目的,所以访问这个地址可能会导致未定义行为,比如程序崩溃。为了避免这种情况,一种常见的做法是在调用 free() 之后手动将指针设置为 NULL。
  
  
  
  
  

二、编程

2.1、组队竞赛

2.1.1、题目

  题源:链接
  牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i。现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人。牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
  例如:
  一个队伍三个队员的水平值分别是3,3,3。那么队伍的水平值是3。
  一个队伍三个队员的水平值分别是3,2,3。那么队伍的水平值是3。
  一个队伍三个队员的水平值分别是1,5,2。那么队伍的水平值是2。

  为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。如样例所示:

  如果牛牛把6个队员划分到两个队伍
  如果方案为:team1:{1,2,5}team2:{5,5,8},这时候水平值总和为7
  而如果方案为:team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10
  没有比总和为10更大的方案,所以输出10。

在这里插入图片描述  
  
  
  

2.1.2、题解:贪心

  说明: ①既然涉及到取较大值,先将输入的数据排序处理;②其次,让每次选值尽量取当前最大两值(由于最大的数不可能是中位数,所以退而求其次,取每组中第二大的);③这样,最终获取到的所有组中的水平值总和最大。

举例:
1 2 3 4 5 6 7 8 911 8 9 -->8;22 6 7 -->6;33 4 5 -->4;
中位数和:864.(当前最大)

下标关系:arr[arr.length-2*(i+1)]
arr.length=9;
i=0时,arr[7]=8;
i=1时,arr[5]=6;
i=2时,arr[3]=4;
i根据n值而定。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {

    //1、输入数据
    long long n;//n个队伍

    while (cin >> n) //OJ题,可能存在多组测试用例
    { 
        vector<int> arr(3 * n);//3*n个选手
        for (int i = 0; i < 3 * n; ++i)
        {
            cin >> arr[i];
        }

        //2、排序
        std::sort(arr.begin(), arr.end());

        //3、找每组水平值
        long long sum = 0;//用于统计最后水平值总和。
        for (int i = 0; i < n; ++i) {
            sum += arr[arr.size() - (2 * (i + 1))];
        }
        cout << sum << endl;
    }

    return 0;
}

  
  
  
  
  

2.2、删除公共字符

2.2.1、题目

  题源:链接
在这里插入图片描述
  
  
  
  

2.2.2、题解一:直接遍历查找删除

  说明: 如下,根据s2中给定查找的字符串,遍历一遍s1,将满足s2中的字符删除。时间复杂度为 O ( M ∗ N 2 ) O(M*N^2) O(MN2) [ 遍历s1(n),erase挪位删除(n),遍历s2(m)。]
  其它: 熟悉string类接口的使用。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    int pos = 0;
    for (size_t i = 0; i < s2.size(); ++i)
    {
        while ((pos = s1.find(s2[i])) != string::npos)
        {
            s1.erase(pos, 1);
        }
    }
    cout << s1 << endl;
    return 0;
}

  
  
  

2.2.3、题解二:借助哈希

  说明:字符串一共256个,可以建立一个char类型的长度固定的数组来做哈希映射,该数组用来统计s2字符串中出现的字母的个数。遍历s1与该哈希数组比较,该数组中存在的值说明在s2中出现过。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1,s2;
    getline(cin,s1);
    getline(cin,s2);

    string ret;
    int hash[256] = {0};//使用哈希映射思想先统计s2中各字符出现的次数
    for(size_t i = 0; i < s2.size(); ++i)
    {
        hash[s2[i]]++;
    }
    for(size_t i = 0; i < s1.size(); ++i)
    {
        if(hash[s1[i]] == 0)
            ret += s1[i];
    }
    cout << ret << endl;
    return 0;
}

  
  
  
  
  
  
  

Fin、共勉。

在这里插入图片描述

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值