笔试强训48天——day3
文章目录
- 一. 单选
- 1.以下程序的输出结果是()
- 2.以下程序的输出结果是()
- 3.以下能对二维数组a进行正确初始化的语句是()
- 4.能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()
- 5.int *p[4] 与选择项中的() 等价
- 6. 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
- 8.下面3段程序代码的效果一样吗()
- 9. 32位系统中,定义**a[3][4],则变量占用内存空间为()。
- 10. 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
- 二. 编程
- 1.字符串中找出连续最长的数字串
- 2. 数组中出现次数超过一半的数字
一. 单选
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()只获取了一次字符
- 以下代码,代码执行之后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
思路一:排序
- 排序整个数组
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;
}
};