【笔试刷题训练】day_02

选择题

在这里插入图片描述

%m.nf

  • m表示输出所占宽度,n表示输出的精度,f表示输出浮点数
  • 如果m是正数,就是右对齐m个字符,若m为负数,就是左对齐m个字符
    %e:输出科学计数法的小数形式
    %lf:输出双精度浮点数
double d = 1234.567;
printf("%e\n",d)

在这里插入图片描述

在这里插入图片描述

(1):const int* p;可以不进行初始化,正确
(2):i的地址赋值给 int const*类型 没毛病
(3):p2中 const修饰的是指针指向的内容,p2指针本身可修改,正确
(4):i的地址赋值给p3,p3指向的内容可修改,p3不可修改,正确
(5):改变p3的指向内容,正确
(6):改变p2的指向内容,错误!
(7):修改p3的指向,错误!’

3.在这里插入图片描述

在这里插入图片描述
5.
在这里插入图片描述
6.
在这里插入图片描述

这里考察的是位段的理解
(1) a是一个无符号整形,大小为4字节共32位,a占19位,还剩下13位
(2) b是一个无符号整形,由于只占用11位,a开辟的4字节空间还剩下13位,所以可以存放下11位
(3) c是一个无符号整形,上面剩下的已经不足,所以还会开辟4字节的空间
(4) c用了32个字节中的4个位,而剩下28个位,不足29个位,所以d还需再开辟4个字节
(5) char类型不同于上面的类型,所以开辟一个新的1字节空间
一共有:4 + 4 + 4 + 1 = 13字节,但是需要考虑内存对齐,结构中最大的字节数为4,32位下默认对齐数也为4,取其最小还是为4,需要是4的整数倍,所以结果是 16!

编程题

1. 倒置字符串

👉 题目链接

思路1:

image-20221013085511322

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    //先对句子整体进行逆置
    reverse(str.begin(),str.end());     
    // i like beijing.
    // .gnijieb ekil i
    // beijing. like i
    //整体逆置之后,把每一个单词逆序
    auto start = str.begin();
    while(start != str.end())
    {
        //每次end 为start(单词的开始处开始向后找空格)
        auto end = start;
        //end不等于 \0 或者空格 那么就向后走 
        while(end != str.end() && *end!=' ')
        {
            ++end;
        }
        //此时 [start,end)一定是一个单词
        reverse(start,end);//逆置该单词
        //更新start(下一次单词的起始位置)
        if(end==str.end())
        {
            //走完了,没单词了
            start = end;
        }
        else
        {
            //没走完,继续下一个单词
            start = end+1;
        }
    }
    cout << str<<endl;
    return 0;
}

思路2

因为 cin >> string对象的时候 是在缓冲区里读取,遇到空格或者字符串就停止,所以可以利用该特性,一个单词一个单词的读入
当缓冲区没有内容的时候,也就是所有的单词都读完的时候,就退出循环
在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str1,str2;
	cin >> str2;	//输入一行到缓冲区,只读入第一个单词
	while(cin >> str1)		//如果缓冲区没有内容了 跳出
	{
		str2 = str1 + " " + str2;	//新读入单词拼接到上一个单词的前面
	}
	cout << str2 << endl;
}

2. 排序子序列

👉 题目链接

思路

在这里插入图片描述
其中 a[n] = 0 主要是为了 防止数组越界访问 | 防止遗漏最后一个单独数的情况
在这里插入图片描述

也就是说

  • 数组设置 n + 1 个主要是为了防止 情况1 和情况2 的越界访问
  • a[n]设置为0 不会影响情况1和情况2的判断,主要是保证第三种情况的正确性
#include<iostream>
using namespace std;
#include<vector>
int main()
{
    int n;
    cin >> n;
    vector<int> v;
    v.resize(n+1);
    v[n]=0;    //最后一个元素设置为0
    //输入数组数据
    for(size_t i = 0;i < n;++i)
    {
        cin >> v[i];
    }
    
    int i = 0;
    int count = 0;
    while(i < n)
    {
        //进入非递减序列
        if(v[i+1] > v[i])
        {
            while(i < n && v[i+1]>v[i])
            {
                ++i;
            }
            //走完非递减
            ++count;
            ++i;    //进入下一段序列
        }
        else if(v[i+1]==v[i])
        {
            ++i; //直接向后走  
        }
        else //进入非递增
        {
            while(i < n && v[i+1] < v[i])
            {
                ++i;
            }
           //走完非递增
            ++count;
            ++i;    //进入下一段序列
        }
    }
    cout << count << endl;
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2021狮子歌歌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值