【基础强训】day1

一、选择题:

1.

以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 是无限循环
B 循环次数不定
C 4次
D 3次

C

y=123为真,所以就循环四次。

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

%s:遇到\0就停止打印,而且常量字符串末尾是\0。

%m.ns:

m:输出字符串的宽度;       n:左起截取n个字符,并且是右对齐,补空格。

%5.3s:

输出字符串的长度是5,左起截取3个字符,并且右对齐,但是还差两个字符,所以要在左边补两个空格。

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

初始化部分i=0,j=-1;条件判断部分j=0为假,不进入循环,所以k=0

 4.

#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 1,2,3   B 1,3,2
C 3,2,1   D 1,3,3

D

这个题考查的就是else和离他最近的if对应。对于第一个If,a==1,b==2为真,b+1=3,

进入第二个if语句b=3!=2为真并且不再进行或运算右边的操作了,所以打印的是1,3,3。

 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   //是第一个0
4 5 6 0
0 0 0 0 

7.

选择表达式 11|10 的结果(本题数值均为十进制)()
A 11   B 10
C 8    D 2

按位或运算|(有1就是1,全0才是0)

11:  1  0  1  1

10:  1  0  1  0 

 所以是1 0 1 1=11

8.

int fun(int a){
a^=(1<<5)-1;
return a;
}
fun(21)运行结果是()
A 10  B 5
C 3   D 8

 A

1<<5---->等价于0000 0001左移5位,0010 0000=32

a^=(1<<5)-1--------->a=a^((1<<5)-1)----------> a=a^31

^按位异或操作--->相同为0相异为1

21:     0001  0101

31:^    0001  1111

10:        0000  1010

 9.

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

 D

A选项先对p解引用,也就是得到year,将year+=1,就从1009变成1010

B选项先对p解引用,也就是得到year,将year+=1,就从1009变成1010

C前置++和后置++在这里相同,同B

D这里++的优先级高于*,也就是p指针会先++,但因为这里是后置++,所以会解引用得到year也就是1009,然后再将指针++,所以我们的year根本就没有++

10.

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

 A

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

二、编程题:

1.组队竞赛

 思路分析:

  • 队伍的水平值等于该队伍队员中第二高水平值,为了所有队伍的水平值总和最大的解法,也就是说每个队伍 的第二个值是尽可能大的值所以实际值把最大值放到最右边,最小是放到最左边。
  • 我们每次尽量取最大,但是最大的数不可能是中位数,所以退而求其次,取每组中第二大的。
  • 例如 现在排序后 有 1 2 5 5 8 9 ,那么分组为1 8 9 和 2 5 5(先升序排列),这里就满足一个关系:arr[arr.length-2*(i+1)],可以带入5,8试一试。

 源码:

#include<iostream>
#include<algorithm>  //这个头文件必须加,要不std的排序就报错
#include<vector>
using namespace std;
int main()
{
    int n=0, m=0;
    cin>>n;
    vector<int> a;
     a.resize(n*3); //给容器开辟合适的空间
   for (int i = 0; i < (3 * n); i++)
    {
        cin >> a[i];
    }
    long long int sum = 0;
    std::sort(a.begin(), a.end());
    for (int i = 0; i < n; i++)
    {
        sum+=a[a.size()-(2*(i+1))];
    }
    cout << sum << endl;
}

2. 删除公共字符

 思路分析:

  1. 我们申请一个字符数组,用来代表256个字符然后把数组2映射到字符数组中,只要是数组2中出现的字符就把对应位置标记为1没有出现的字符标记为0.
  2. 然后我们可以通过查询数组1中的字符在数组中对应的位置是否为1,如果为1,则删除。
  3. 把所有位置上的数是0的全部相加到一个新数组上就行了。
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str1;
    string str2;
    getline(cin, str1);  //cin如果遇到空格就会自动停止,所以用getline
    getline(cin, str2);
   char hashtable[256]={0}; 
   for(size_t i=0;i<str2.size();i++) //先映射str2
   {
        hashtable[str2[i]]++; //str映射到hashtable上的位置数值
        //只要不为0就可以
   }
   string ret; //新字符串来存储删除后的字符串
   for(size_t i=0;i<str1.size();i++)
   {
       if( hashtable[str1[i]]==0)
       {
         ret += str1[i];  //把位置上不为0的字符全部想加
       }
   }
   cout<<ret<<endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值