笔试强训48天——day1

一. 单选

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

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

A 是无限循环
B 循环次数不定
C 4次
D 3次
正确答案:C

x>=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

正确答案:B

%m.ns
m:输出字符串的宽度
n:左起截取目标字符串n个字符,并且是右对齐,补空格
其中5是指字符输出占五个位置,3表示从中取三个字符,5>3所以com之前补两个空格

 

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

A -1
B 0
C 1
D 2

正确答案:B

for循环判断部分是j=0,进入循环一开始就把j赋值成了-1,所以跳出循环,看不变还是0

 

4.下面程序输出是什么?

#include <stdio.h>
int main()
{
int a=1,b=2,c=3,d=0;
if(a == 1 && b++==2)//b == 3
   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 1,2,3
B 1,3,2
C 3,2,1
D 1,3,3
正确答案:D

if else配套原则:就近原则
第一个else和第二个if配套,第二个else和第二个if配套 && 两边表达式都为真才为真 ||
一边为真就是真 左边表达式为真就不会执行右边的表达式了

 

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

A char
B int
C double
D float
正确答案:C

自动提升,小->大
char -128~127
int -21亿~21亿
double 2.3*10-308~1.7*10308
由此可见double最大,所以在运算中char与int会自动提升为double

 

6. 在int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};中,p[1][2]的值是()

A 1
B 0
C 6
D 2
正确答案:B

行被省略,在没有被初识化的默认是
0 1 0 0
3 2 0 0
4 5 6 0
0 0 0 0

 

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

A 11
B 10
C 8
D 2

正确答案:A

11: 0000 1011
10:0000 1010
||按位或:只要有1就是1
0000 1011–>11

 

8.fun(21)运行结果是()

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

A 10
B 5
C 3
D 8

正确答案:A

a^=b等价于 a = a^b
1<<5 0000 0001 0010 0000 : 32
a^=(1<<5)-1等价于a =a^((1<<5)-1)
a = a^31 a = 21^31
21:0001 0101
31:0001 1111
按位异或:不相同就是1,其他结果都是0
0000 1010 10

 

9.若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()

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

正确答案:D

*p 1009 *p+=1 1010
*p++ 后置++,先在++前对p解引用获取到year变量的值,然后再对指针p进行++

 

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

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

free释放掉一个指针内容后,只是销毁了指针所指向的空间,变成野指针,并没有对指针置空

 

 

二. 编程

1.组队竞赛

做题链接
题目:

牛牛举办了一次编程比赛,参加比赛的有3n个选手,每个选手都有一个水平值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.
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3
n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
输出描述:
输出一个整数表示所有队伍的水平值总和最大值.
示例1:
输入
2 5
2 8 5 1 5
输出
10

思路:

1.排序
先从大到小排成一列
123456789

2.分组
1 8 9
2 6 7
3 4 5
i = 1 ,2 ,3

3.拿取中间值
公式:arr.len-2*(i+1)

正确答案:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n ;
    while (cin>>n)//循环输入
    {
        int i = 0;
            long long sum = 0;
            vector<int> a;
            a.resize(3*n);//开空间
            for(int i = 0;i<(3*n);i++)
            {
                cin>>a[i]            
            }
            //排序
                std:: sort(a.begin(),a.end());
            for(i=0;i<n;i++)
            {
                sum += a[a.size()-(2*(i+1))]; 
                          
            }
            cout <<sum<<endl;
    }
}

&nbsp;

2.删除公共字符

做题链接
题目:

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are
students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
示例1:
输入
They are students.
aeiou
输出
Thy r stdnts.

 
思路:

本题如果使用传统的暴力查找方式,如判断第一个串的字符是否在第二个串中,在再挪动字符删除这个字符
的方式,效率为O(N^2),效率太低,很难让人满意。

  1. 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。
  2. 判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可
    以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串

正确答案:

#include<iostream>
#include<string>
using namespace std;
int main()
{
// 注意这里不能使用cin接收,因为cin遇到空格就结束了。
// oj中IO输入字符串最好使用getline。
string str1,str2;
//cin>>str1;
//cin>>str2;
getline(cin, str1);
getline(cin, str2);
// 使用哈希映射思想先str2统计字符出现的次数
int hashtable[256] = {0};
for(size_t i = 0; i < str2.size(); ++i)
{
hashtable[str2[i]]++;
} 
// str2中没有出现过,则将他+=到ret。注意这里最好不要str1.erases(i)
// 因为边遍历,边erase,容易出错。
string ret;
for(size_t i = 0; i < str1.size(); ++i)
{
if(hashtable[str1[i]] == 0)
ret += str1[i];
} 
cout<<ret<<endl;
return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值