【刷题汇总--简写单词、dd爱框框、除2!】

C++日常刷题积累

  • 今日刷题汇总 - day003
    • 1、简写单词
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现 - 思路1
      • 1.4、程序实现 - 思路2(优化)
    • 2、dd爱框框
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现 - 蛮力法
      • 2.4、程序实现 - 同向双指针(滑动窗口)
    • 3、除2!
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现
    • 4、题目链接

今日刷题汇总 - day003

1、简写单词

1.1、题目

在这里插入图片描述

1.2、思路

首先,读完题,明白就是要求把一段由几个单词组成的字符串,其首字母大写并输出即可。那么,我们很快想到,遍历一遍字符串把单词首字母大写后输出即可。那么,如何确定单词首字母呢?通过观察示例不难看出,每一个空格后接着就是单词的首字母。那么,第一个思路就是先直接判断第一个子母是否为小写字母,是则转换为大写子母后输出,否则直接输出,然后遍历字符串判断是否为空格,是则判断空格的下一个子母是否为小写字母,是则转换为大写后输出,否则直接输出,直到遍历结束即可。
当我做完提交后,发现代码比较冗余,可以进行优化。既然,要输入多个单词,可直接输入一个处理一个单词,直接优化了第一个方法的很多细节的处理。接下来,两个思路都用程序实现一下吧。

1.3、程序实现 - 思路1

首先,按照分析的题目要求写好输入,求得字符串长度,判断只有一个子母时,是否为小写,如果是小写则转换为大写再输出,否则直接输出即可。这里用到了getline函数和size函数以及islower函数和toupper函数。值得注意的是,toupper等函数的返回值,所以需要强转一下。

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

int main()
{
    string word;
    getline(cin, word);
    size_t n = word.size();
    if (n == 1)
    {
        if (islower(word[0]))
        {
            cout << (char)toupper(word[0]);
        }
        else
            cout << word[0];
    }
    else
    {
       
    }
    return 0;
}

接着,处理字符串长度大于1的情况,如果是只有一个单词,直接像刚才处理的一样判断之后处理输出即可,否则遍历字符串,判断空格,判断空格后的子母,是否处理再输出即可。

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

int main()
{
    string word;
    getline(cin, word);
    size_t n = word.size();
    if (n == 1)
    {
        if (islower(word[0]))
        {
            cout << (char)toupper(word[0]);
        }
        else
            cout << word[0];
    }
    else
    {
        if (islower(word[0]))
        {
            cout << (char)toupper(word[0]);
        }
        else
            cout << word[0];
        for (int i = 0; i < n; i++)
        {
            if (word[i] == ' ' && word[i+1])
            {
                if (islower(word[i + 1])) cout << (char)toupper(word[i + 1]);
                else cout << word[i + 1];
            }
        }
    }
    return 0;
}

1.4、程序实现 - 思路2(优化)

在思路1基础上进行优化,既然要逐个输入单词,那么直接逐个单词进行判断处理,方便快捷,这种思想称为预处理方法,常用于明确只需要遍历一遍的输入场景。与day002的数组中两个字符串的最小距离,场景逐个输入类似,所以这类场景常用。另外,这样的输入,自动处理了空格,不需要额外对空格的处理。

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

int main() 
{
    string word;
    while(cin >> word)
    {
        if(islower(word[0]))
            cout << (char)toupper(word[0]);
        else
            cout << word[0];
    }
    return 0;
}

额外说明一下,C++的头文件属于是集成了字符串相关的头文件,比如strcmp的头文件,islower的头文件,所以如果是C语言就需要添加<ctype.h>头文件即可。当然不使用,函数也可以利用字符判断。

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

int main() 
{
    string word;
    while(cin >> word)
    {
        if('a' <= word[0] && word[0] <= 'z')
            cout << (char)(word[0] - 'a' + 'A');
        else
            cout << word[0];
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述

2、dd爱框框

2.1、题目

在这里插入图片描述

2.2、思路

首先,读完题,得知,要求一段数组中和最小的区间。既然如此,那么定义一个左区间标志retl和右区间标志retr,那么它们之间的距离retlen最小就是最小区间。那么不难想到蛮力法,利用两层for循环蛮力法,遍历求解,左区间不动,右区间从左区间处,遍历求和,直到sum>=x值时,标记并求得retlen,再将sum置0,左区间++,右区间回到左区间处,继续遍历直到sum>=x值时,再次标记左右区间的位置给retl和retr,然后,依次类推。求得最小区间。其中,注意处理一些细节,此题数组下标是从1开始,如果从0开始输出时需+1,当出现相同长度的retlen时,要处理选择retl最小的哪个区间,此外,得注意题目的数据范围n(1≤n≤10000000),x(1≤x≤10000)和时间2秒以及空间要求,所以使用蛮力法是会出现超时等问题的,不过蛮力法对于个人而言是值得,锻炼编程思维处理一些细节问题的,所以依然写一写蛮力法。
那么此类题,不使用蛮力法,该使用什么方法呢?
再读题,发现,题目的已知条件中权值正整数,即全是>=1的数据,求区间就涉及到两个指针的操作变换关系且两个指针遍历方向一致,所以更好的方法是采用同向双指针法,即典型的滑动窗口法。这也是这道题的主要考点而不是蛮力法。
那么滑动窗口方法的步骤,通常需要四步:
(1)、进窗口:对于此题就是,sum += a[right];
(2)、判断条件:对于此题就是,sum >= x;
(3)、指针关系的更新,即结果更新:对于此题就是,right-left+1 < retlen;
(4)、出窗口:对于此题就是,sum -= a[left];
接下来就是程序实现。

2.3、程序实现 - 蛮力法

首先,按照思路的分析,定义好变量和数据范围,写好输入和两层for循环,

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

const int N = 1e7 + 10;

int main()
{
    int n, x;
    cin >> n >> x;
    int a[N];
    for (int i = 1; i < n; i++)
    {
        cin >> a[i];
    }
    int sum = 0;
    int retl,retr;
    int retlen = INT_MAX;
    for (int i = 1; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            sum += a[j];
            if (sum >= x)
            {
                
            }
        }
        sum = 0;
    }
    cout << retl << ' ' << retr;
    return 0;
}

接着处理,一些细节问题,当出现相同长度的retlen时,直接break,且处理retlen更新时才置换retr和retl的值。

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

const int N = 1e7 + 10;

int main()
{
    int n, x;
    cin >> n >> x;
    int a[N];
    for (int i = 1; i < n; i++)
    {
        cin >> a[i];
    }
    int sum = 0;
    int retl,retr;
    int retlen = INT_MAX;
    for (int i = 1; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            sum += a[j];
            if (sum >= x)
            {
                if (j - i == retlen)
                {
                    sum = 0;
                    break;
                }
                if (retlen > j - i)
                {
                    retlen = min(retlen, j - i);
                    retl = i;
                    retr = j;
                }
                sum = 0;
                break;
            }
        }
        sum = 0;
    }
    cout << retl << ' ' << retr;
    return 0;
}

在这里插入图片描述
注意题目的数据范围n(1≤n≤10000000),x(1≤x≤10000)和时间2秒以及空间要求,所以使用蛮力法是会出现超时等问题的。由于是蛮力法,所以超时也毋庸置疑。
在这里插入图片描述

2.4、程序实现 - 同向双指针(滑动窗口)

接下来,在蛮力法基础上进行优化,为了方便描述左区间定义为left,右区间为right,再定义retLen 、retLeft 、retRight,分别存放步骤3的更新结果和更新的左区间以及更新的右区间。然后根据步骤(1)、进窗口:对于此题就是,sum += a[right];
(2)、判断条件:对于此题就是,sum >= x;
(3)、指针关系的更新,即结果更新:对于此题就是,right-left+1 < retlen;
(4)、出窗口:对于此题就是,sum -= a[left];
编写程序即可。

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

const int N = 1e7 + 10;

int main()
{
    int n, x;
    cin >> n >> x;
    int a[N];
    for (int i = 1; i < n; i++)
    {
        cin >> a[i];
    }
    int left = 0, right = 0, sum = 0;
    int retLen = N, retLeft = -1, retRight = -1;
     while(right <= n)
     {
         sum += a[right];//步骤一
         while(sum >= x)//步骤二
         {
             if(right - left + 1 < retLen)//步骤三
             {
                 retLeft = left;
                 retRight = right;
                 retLen = right - left + 1;
             }
             sum -= a[left++];//步骤四,这里不好理解可以理解为上面蛮力法中的将右区间置回左区间处,方便重新求sum的意思。所以这里就是左区间窗口向右缩,类似于KMP算法不用让右区间回置,从而实现的优化。
         }
         right++;
     }
     cout << retLeft << " " << retRight << endl;
    return 0;
}

在这里插入图片描述

在这里插入图片描述

3、除2!

3.1、题目

在这里插入图片描述

3.2、思路

首先,读完题,明白要求实现一组n个数据的和sum最小,且可对偶数进行k次除2操作。分析示例,就能看出,只需要每一次操作都对当前这组数据的最大的偶数进行除2即可,这样求得的和就是最小的。那么,很快想到熟悉的数据结构堆的特性,利用其中的大根堆就可以巧妙的完成每次对最大的偶数操作,所以堆中数据就只需要存放偶数即可。另外,值得注意的是,在堆顶最大偶数进行除2操作后,得让它pop出堆,使第二大的偶数存放至堆顶,便于下一次操作,而且还需要判断堆顶除2操作完成后,是否仍然是偶数,那么继续进堆排队即可。此外,我在写这道题时,总是超时发现,数据范围是10^9,所以这里需要用long long,接下来就是程序实现。

3.3、程序实现

首先,按照题目数据范围要求定义变量,写好输入,并且依然可以采用预处理方式不用建立数组,减少空间消耗,然后巧妙地利用priority_queue特性(底层就是大根堆)定义大根堆heap,再输入n个数据,求输入数的和,并把偶数建堆。

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

int main()
{
    long long n,k;
    cin >> n >> k;
    long long a,sum = 0;
    //巧妙利用大根堆
    priority_queue<long long> heap;
    
    while(n--)
    {
        cin >> a;
        sum += a;
        if(a % 2 == 0)
            heap.push(a);
    }
    return 0;
}

接着,开始进行除2操作k次,当然得保证堆中还有偶数,即heap.size()为真才进行操作,然后定义一个中间变量temp,存放堆顶除2操作后的数据,再pop堆顶让第二大的偶数,放置堆顶,然后sum减去变量temp,就是当前一次操作后的最小和,如果堆顶除2操作后还是偶数继续进堆,依此类推,直到k次操作完成或堆中没有偶数结束即可。

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

int main()
{
    long long n,k;
    cin >> n >> k;
    long long a,sum = 0;
    //巧妙利用大根堆
    priority_queue<long long> heap;
    
    while(n--)
    {
        cin >> a;
        sum += a;
        if(a % 2 == 0)
            heap.push(a);
    }
    
    while(heap.size() && k--)
    {
        long long temp = heap.top() / 2;
        heap.pop();
        sum -= temp;
        if(temp % 2 == 0)
            heap.push(temp);
    }
    
    cout << sum << endl;
    return 0;
}

在这里插入图片描述
在这里插入图片描述

4、题目链接

简写单词
dd爱框框
除2!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768220.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Trident Dehazing Network

Trident去雾网络 【Trident&#xff1a;三齿的&#xff0c;三叉戟】 摘要 针对现有的去雾方法对非均匀雾霾的鲁棒性差&#xff0c;以及高雾霾区域的信息未知且难以估计&#xff0c;导致去雾效果模糊的问题&#xff0c;提出了一种由粗到精的模型Trident Dehazing Network&…

基于iview.viewUI实现行合并(无限制/有限制合并)【已验证可正常运行】

1.基于iview.viewUI实现行合并&#xff08;列之间没有所属对应关系&#xff0c;正常合并&#xff09; 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内直连GPT4o 只需要修改以下要合并的列字段&#xff0c;就可以方便使用啦 mergeFields: [majorNo, devNam, overhaulAdvic…

查找python包的安装路径

前提&#xff1a;自己已经安装过的包 1、打开任一python解析器&#xff0c;如VSCode 2、 以matplotlib为例&#xff0c;敲下面命令 import matplotlibprint(matplotlib.path) 3、运行代码就可以了 需要注意&#xff1a; 部分包没有path&#xff08;比如time&#xff09;&am…

使用 Java Swing 和 XChart 创建多种图表

在现代应用程序开发中&#xff0c;数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库&#xff0c;支持多种类型的图表&#xff0c;非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…

韩语日常口语留学韩语旅游韩语口语柯桥语言培训

韩语每日一词打卡&#xff1a;행정적[행정적]【名词】行政 原文:나라는 항상 행정적 명령을 통해 경제운행을 조절합니다. 意思&#xff1a;国家经常通过行政命令去调节经济的运行。 【原文分解】 1、항상[항상]总是 &#xff0c;经常 2、나라[나라]国家 3、명령[명:녕]命令 …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

10 docker 安装 mysql详解

目录 一、安装mysql 1. 镜像获取 2. 简单版 2.1. 使用mysql镜像 2.2. 建库建表插入数据 2.3. 外部win 连接并插入中文数据测试 2.4. 简单版本问题 3. 创建容器-实战版 3.1. 新建容器实列并挂载卷 3.2. 新建my.cnf , 解决中文乱码 3.3. 重启容器验证 3.4. 总结 一、…

2024年精选推荐的16个向量数据库:提升你的AI应用性能

在人工智能时代&#xff0c;向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。随着AI和机器学习应用的普及&#xff0c;这些模型生成的嵌入…

聊一聊领域驱动和贫血

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量&#xff0c;而影响代码质量的因素向来都不是单一的&#xff0c;诸如项目因素、管理因素、技术选型、人员素质等等&#xff0c;因为是技术债务&#xff0c;自然就从技术角度来分析&#xff0c;单纯从技术角…

UOS系统中JavaFx笔锋功能

关于笔锋功能&#xff0c;网上找了很久&#xff0c;包括Java平台客户端&#xff0c;Android端&#xff0c;相关代码资料比较少&#xff0c;找了很多经过测试效果都差强人意&#xff0c;自己也搓不出来&#xff0c;在UOS平台上JavaFX也获取不到压力值&#xff0c;只能用速度的变…

c++习题07-求小数的某一位

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 被除数a的类型设置为long long类型&#xff0c;a变量需要变大&#xff0c;需要更大的数据类型来存储除数b和指定的小数位置n为int类型&#xff0c;这两个变量的的…

计算机图形学入门23:蒙特卡洛路径追踪

1.前言 前面几篇文章介绍了Whitted-style光线追踪&#xff0c;还介绍了基于物理渲染的基础知识&#xff0c;包括辐射度量学、BRDF以及渲染方程&#xff0c;但并没有给出解渲染方程的方法&#xff0c;或者说如何通过该渲染方程计算出屏幕上每一个坐标的像素值。 Whitted-style光…

未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!

我们自幼接受的教育是&#xff0c;学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略&#xff0c;解放思想和改革开放必定会发生&#xff0c;和平和发展必定是世界的主题&#xff0c;中国经济必定是高速增长…… 然而&#xff0c;在真正的历史学家眼中&#xff0c;历史…

1分钟了解,预写日志WAL的核心思路...

上一篇《刷盘&#xff0c;还是不刷盘&#xff0c;是一个问题》中我们遇到了哪些问题&#xff1f; 1. 已提交事务未提交事务的ACID特性怎么保证&#xff1f; 画外音&#xff1a;上一篇中遇到的问题&#xff0c;主要是原子性与持久性。 2. 数据库崩溃&#xff0c;怎么实施故障恢复…

新声创新20年:无线技术给助听器插上“娱乐”的翅膀

听力损失并非现代人的专利&#xff0c;古代人也会有听力损失。助听器距今发展已经有二百多年了&#xff0c;从当初单纯的声音放大器到如今的全数字时代助听器&#xff0c;助听器发生了翻天覆地的变化&#xff0c;现代助听器除了助听功能&#xff0c;还具有看电视&#xff0c;听…

AD导入.step 3D封装

在网站查找想要的3D封装 https://www.3dcontentcentral.cn/ 下载 AD导入 在封装库下导入

融云上线 HarmonyOS NEXT 版 SDK,全面适配「纯血鸿蒙」生态

6 月 21 日&#xff0c;“2024 华为开发者大会”正式发布使用自研内核的原生鸿蒙系统 HarmonyOS NEXT&#xff0c;即 “纯血鸿蒙”。 同时&#xff0c;华为宣布开放“鸿蒙生态伙伴 SDK 市场”&#xff0c;甄选各类优质、安全的 SDK 加入聚合平台&#xff0c;助力各行业开发者轻…

数据结构初阶 堆的问题详解(三)

题目一 4.一棵完全二叉树的节点数位为531个&#xff0c;那么这棵树的高度为&#xff08; &#xff09; A 11 B 10 C 8 D 12 我们有最大的节点如下 假设最大高度为10 那么它的最多节点应该是有1023 假设最大高度为9 那么它的最多节点应该是 511 所以说这一题选B 题目二 …