笔试强训48天——day3

一. 单选

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

#include <stdio.h>
main() {
char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
int i;
i = 8;
p = a + i;//指向字符9
printf("%s\n", p - 3);//从6开始打印,%s是遇到0(\0)才停止打印
}

A 6
B 6789
C ‘6’
D 789

确答案:B

 

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

#include <iostream.h>
int main()
{
int x=3,y=3;
switch(x%2)
{ c
ase 1:
switch (y)
{ c
ase 0:
cout<<"first";
case 1:
cout<<"second";
break;
default:
cout<<"hello";
}
case 2:
cout<<"third";
}


return 0;
}

A second third
B hello
C first second
D hellothird

由于case1中没有break语句,所以会一直向下执行直到遇到break或者整个switch结束

正确答案:D
 

3.以下能对二维数组a进行正确初始化的语句是()

A int ta[2][]={{0,1,2},{3,4,5}};
B int ta[][3]={{0,1,2},{3,4,5}};
C int ta[2][4]={{0,1,2},{3,4},{5}};
D int ta[][3]={{0,2},{},{3,4,5}};
正确答案:B

几行几列
只能省略行,不能省略列
要连续初始化,中间不能断开

 

4.能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()

A return这二个数
B 形参用数组
C 形参用二个指针
D 用二个全局变量
正确答案:A

每次return只能一个数据类型

 

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

A int p[4]
B int *p
C int *(p[4])
D int (*p)[4]
正确答案:C

int *p[4] int类型的指针数组,数组大小为4
A int p[4] int类型数组,数组大小为4
B int *p int类型的指针
C int *(p[4]) int类型的指针数组,数组大小为4
D int (*p)[4] int类型数组指针,数组大小为4

 

6. 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是

A n=0;while(ch=getchar()!=‘\n’)n++;
B n=0;while(getchar()!=‘\n’)n++;
C for(n=0;getchar()!=‘\n’;n++);
D n=0;for(ch=getchar();ch!=‘\n’;n++);

正确答案:D

初始化过程只会执行一次,ch=getchar()只获取了一次字符

 

  1. 以下代码,代码执行之后ptr指向的内容是?
char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;//指向f字符

A Compiler error
B fg
C efg
D defg

正确答案:B

 

8.下面3段程序代码的效果一样吗()

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

A (2)=(3)
B (1)=(3)
C (1)=(2)
D 都不一样
正确答案:C

常量指针:所指框架的值是一个常量,不能改变指针的指向
指针常量:不能改变指针的指向,但是可以指针解引用改变所指空间的值
区分:const在的左边是常量指针 const在的右边是指针常量
(1)const int *a = &b;常量指针
(2)int const *a = &b;常量指针
(3)int *const a = &b;指针常量

 

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

A 4
B 48
C 192
D 12

正确答案:B

**a[3][4] 三行四列的数组,指针类型
12*4 = 48

 

10. 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
} 

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

little endian小端
大端:低位存高地址
小端:低位存低地址
int i = 1;
低——>高
大端:00 00 00 01
小端:01 00 00 00
long long类型占8字节
a:01 00 00 00 00 00 00 00
b:02 00 00 00 00 00 00 00
c:03 00 00 00 00 00 00 00
函数栈帧:从右往左入栈,先从c入栈再入b再入a
<——
01 00 00 00 0000 00 00 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
低地址——高地址
打印是后入先出,也就是从左往右去打印
——>
01 00 00 00 0000 00 00 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
%d是按4个字节打印,再转化为十进制
1 0 2

 

 

二. 编程

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

[做题链接]](https://www.nowcoder.com/practice/bd891093881d4ddf9e56e7cc8416562d?tpId=85&&tqId=29864&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking)

读入一个字符串str,输出字符串str中的连续最长的数字串

输入描述:
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述:
在一行内输出str中里连续最长的数字串。

示例1:
输入
abcd12345ed125ss123456789
输出
123456789

思路:
1.创建三个字符串,s,cur,ret分别是原字符串,存数字串,结果串
遍历字符串(for),遇到纯数字就放入cur中
2.当遍历到字母时,cur中已经存有数字串,就把cur中的数字串与ret中的做比较,若ret小于cur那就将cur中的数字串拷贝到ret之中,直到遍历完整个s
打印结果ret
3.注意边界:i<=s.length() 如果写成小于且s的最后是数字串就无法进入for循环中的比较环节,结果就会出错

正确答案

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

int main()
{
    string s,cur,ret;
    cin>>s;

    for(int i = 0;i<=s.length();i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            cur += s[i]; 
        }
        //比较
        else{
            if( ret.size()<cur.size())
            {
                ret = cur;
            }
            else{
                cur.clear();
            }

        }
    }
    cout<<ret<<endl;
    return 0;
}

 
 

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

做题链接

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

输入描述:
保证数组输入非空,且保证有解

示例1:
输入
[1,2,3,2,2,2,5,4,2]
输出
2

例2:
输入
[3,3,3,3,2,2,2]
输出
3
示例3:
输入
[1]
输出
1

思路一:排序

  1. 排序整个数组
    2.找到中间的数字mid
    3.再次遍历数组看mid出现几次,判断是否是要找的那个数

正确答案

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty())
        {
            return 0;
        }

        sort(numbers.begin(),numbers.end());
        int mid = numbers[numbers.size()/2];
        int count = 0;

        for(int i = 0;i < numbers.size();i++)
        {
            if(mid == numbers[i])
            count++;
        }

        if(count > numbers.size()/2)
        {
            return mid;
        }
        else return 0;
    
    }
};

推荐

思路二:众数
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,如果存在众数,最后留下的那个数一定是众数
1.设置两个变量 result与times,time是表示数字出现的次数默认为一次
2.result从数组第一个元素开始,第二个与前一个进行比较,相同times++,不同times–并消去这两个元素

正确答案

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()) return 0;

        int ret = numbers[0];
        int times = 1;

//从第二个元素开始比较所以i要从1开始
        for(int i = 1; i<numbers.size();++i)
        {
            if(times != 0)
            {
                if(numbers[i] == ret)
                {
                    times++;
                }
                else times--;

            }
            //消去前两个,重新开始比较
            else{
                ret = numbers[i];
                times = 1;

            }
        }

        //判断是否为众数
        int count = 0;
        for(int i = 0;i<numbers.size();++i){
            if(numbers[i] == ret )
            count++;
        }
        if(count > numbers.size()/2)
        {
            return ret;
        }
        return 0;
    
    }
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hey pear!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值