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

news2024/11/19 9:40:23

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.coloradmin.cn/o/1890586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcTs布局入门04——相对布局 媒体查询

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧 扫描下面的二维码关注公众号。 本文将探讨相对布局与媒体查询&#xff0c;为啥把他们放到一起呢&#xff1f;主要是因为相对布局在响应式的场景下做得不太好&#xff0c;一般情况下和媒体查询&#xff08;不同尺…

Visual Studio 中的键盘快捷方式

1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1…

使用EndNote在Word中插入参考文献,并编辑参考文献样式方法

一、背景 在准备中期报告时&#xff0c;学校给的是Word模板&#xff0c;习惯了Latex排版和添加参考文献的便利后&#xff0c;真不想用word写东西。 之前投《机器人》期刊&#xff08;被拒了&#xff09;和准备开题的时候也是用word写的&#xff0c;当时为方便添加参考文献和定…

【Linux】线程封装与互斥(万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 C多线程的用法 对原生线程进行一次封装 理解pthread线程 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 操作共享变量会有问题的售票…

20万内最能打的颜值,小鹏MONA M03开启全球首秀

7月3日&#xff0c;小鹏MONA M03开启全球首秀。这款为年轻用户打造的智能纯电掀背轿跑&#xff0c;以其独特的AI量化美学设计吸引了行业关注。 据「TMT星球」了解&#xff0c;小鹏汽车董事长CEO何小鹏携手造型中心副总裁胡安马洛佩兹&#xff08;JuanMa Lopez&#xff09;共同…

【高中数学/基本不等式】已知:x,y皆大于1,且x+2y=4 求:1/(x-1)+1/(y-1)的最小值为?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 之第一题 【问题】 已知&#xff1a;x,y皆大于1&#xff0c;且x2y4 求&#xff1a;1/(x-1)1/(y-1)的最小值为&#xff1f; 【解答】 解&#xff1a; 若将(x2y)/41代入目标式&…

OpenGL3.3_C++_Windows(27)

法线/凹凸贴图 如何让纹理产生更细节的效果&#xff0c;产生凹凸视觉感&#xff1f;解决思路之一&#xff1a;镜面贴图(黑—白&#xff09;&#xff08;&#xff08;diffuse贴图&#xff08;rgba&#xff09;&#xff09;&#xff0c;阻止部分表面被照的更亮&#xff0c;但这并…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit简介】

Data Loss Prevention Kit简介 Data Loss Prevention Kit&#xff08;数据防泄漏服务&#xff0c;简称为DLP&#xff09;&#xff0c;是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供文件权限管理、加密存储、授权访问等能力&#xff0c;数据所有者可以基于帐号认证对…

pjsip环境搭建、编译源码生成.lib库

使用平台&#xff1a; windows qt(5.15.2) vs(2019)x86 pjsip版本以及第三方库使用 pjsip 2.10 ffmpeg4.2.1 sdl2.0.12pjsip源码链接&#xff1a; https://github.com/pjsip/pjproject源码环境配置 首先创建两个文件夹&#xff0c;分别是include、lib其中include放置ff…

亚马逊跟卖卖家还在选品发愁吗!已经有卖家用这种方式选品大卖!

对于亚马逊相信很多卖家都不陌生&#xff0c;也有很多新手卖家涌入&#xff0c;但是进入后就不知道怎么选品了&#xff0c;很多新手卖家是不是天天盯着亚马逊页面的产品&#xff0c;眼花撩乱的&#xff0c;不知道那些产品&#xff0c;能跟卖那些不能跟卖&#xff0c;也有些卖家…

通过卷防水上限,解锁手机的新玩法?IP68之间亦有不同

当手机的日常防水已经成了基本功&#xff0c;防水能力的上限便成了新的赛道。 毕竟再谨慎的人&#xff0c;也可能会有手滑的时候。这个时候&#xff0c;一台有着IP68级防水的手机&#xff0c;就能给你提供一份安心。 【IP68是标准上限&#xff0c;不是手机防水上限】 IP68是…

据阿谱尔统计,全球mRNA原料酶市场预计2024年达到11.98亿美元

Codexis 宣布与 Aldevron 达成协议&#xff0c;授予 Aldevron Codexis 的 Codex HiCap RNA 聚合酶的全球制造和商业化权利。 Applied DNA、Maravai LifeSciences (MRVI) 和 Alphazyme 达成协议&#xff0c;Alphazyme 将扩大 Applied DNA 专有 Linea™ RNA 聚合酶 (RNAP) 的生产…

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

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

Character.ai因内容审查流失大量用户、马斯克:Grok-3用了10万块英伟达H100芯片

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 1、爆火AI惨遭阉割&#xff0c;1600万美国年轻人失恋&#xff1f;Character.ai被爆资金断裂 美国流行的社交软件Character.ai近期对模型进行大幅度内容审查&#xff0c;导致用户感到失望并开始流失。…

国内外生成式AI教育产品:深度解析教育各环节的智能化教学

随着人工智能技术的飞速发展&#xff0c;教育行业迎来了一场革命性的变革。 2024年&#xff0c;AI教育产品不仅在课堂上大放异彩&#xff0c;更在课前备课、课后辅导、教研支持等各个环节发挥着重要作用。 本文将为您全面总结AI教育产品如何渗透教育的每一个环节&#xff0c;…

PD虚拟机对电脑配置要求高吗 PD虚拟机配置怎么改 Parallels Desktop使用教程

说到虚拟机&#xff0c;很多人会觉得电脑需要很高的配置才能安装。其实不然&#xff0c;有些虚拟机软件的技术已经很成熟&#xff0c;不需要借助电脑的高配置支撑其功能&#xff0c;比如PD软件&#xff0c;很多旧的Mac机型都能安装使用。本文会给大家详细介绍PD虚拟机对电脑配置…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit开发指导】

Data Loss Prevention Kit开发指导 DLP是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供一种称为DLP的文件格式。后缀格式为“原始文件名&#xff08;包含原始文件后缀&#xff09;.dlp”&#xff0c;例如: “test.docx.dlp”&#xff0c;文件由授权凭证和原始文件密文…

09 docker 安装tomcat 详解

目录 一、安装tomcat 1. tomcat镜像的获取 2. docker创建容器实列 3. 访问测试 404错误 4. 解决方案 5. 使用免修改版容器镜像 5.1. 运行实列的创建 5.2. 出现问题及解决&#xff1a; 6. 验证 OK 一、安装tomcat 1. tomcat镜像的获取 docker search tomcat #docker …

Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件

有时&#xff0c;我们可能需要在显示 PDF 文件时更改缩放比例以满足我们的要求。在本文中&#xff0c;我们将演示如何使用 Spire.PDF for .NET 以特定的缩放比例/百分比&#xff08;例如默认值、100% 或任何其他所需的缩放比例&#xff09;打开 PDF 文件。 Spire.PDF for .NET…

echarts legend组件单独设置样式形状

为legend组件单独设置一个样式 //单独legend样式 const customLegend {name: test,// 设置文本为红色textStyle: {color: red} } legend: {data: [Email, Union Ads, Video Ads, Direct, Search Engine, customLegend ] }注意事项&#xff1a;series里面也必须配置与legend相对…