AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

news2024/9/27 19:20:49

目录

4806. 首字母大写

题目描述:

实现代码:

4807. 找数字

题目描述:

实现代码:

回溯(超时):

原理思路:

贪心:

原理思路:

4808. 构造字符串

问题描述:

实现代码与解析:

kmp:

原理思路:


4806. 首字母大写

题目描述:

        给定一个由大小写字母构成的单词。

如果单词的首字母为小写字母,则请你将该首字母转换为对应大写字母。

如果单词的首字母为大写字母,则不做任何变化。

输出最终的单词。

实现代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    if('A' <= s[0] && s[0] <= 'Z' )
    {
        cout << s <<endl;
    }
    else
    {
        s[0]-= 32;
        cout << s <<endl;
    }
}

或则直接这样写:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    s[0] = toupper(s[0]);
    cout << s <<endl;
}

4807. 找数字

题目描述:

        给定一个正整数 m 和一个非负整数 s。

请你找到长度为 m且各位数字之和为 s 的最小和最大非负整数。

要求所求非负整数不得包含前导零。

实现代码:

回溯(超时):

#include <bits/stdc++.h>
using namespace std;
int result1 = 0;//求最大
int result2 = INT_MAX;//求最小
vector<int> path;
void backtrack1(int m, int s, int index)
{
    if (path.size() == m)
    {
        int sum1 = 0;
        for (int i = 0; i < path.size(); i++)
        {
            sum1 += path[i];
        }
        if (sum1 == s)
        {
            int sum = 0;
            for (int i = 0; i < path.size(); i++)
            {
                sum = sum * 10 + path[i];
            }
            if (sum > result1) result1 = sum;
            if (sum < result2) result2 = sum;
        }    
        return;
    }
    int i = 0;
    if (path.empty())
    {
        i = 1;
    }
    for (i; i < 10 && i <=  s - index; i++)
    {
        path.push_back(i);
        backtrack1(m, s, index + i);
        path.pop_back();
    }
}

int main()
{
    int min = INT_MAX;
    int max = 0;
    int m;//组成个数
    int s;//数
    cin >> m;
    cin >> s;
    //排除无解
    if(s > m * 9 || s == 0 && m > 1)
    {
        cout << "-1 -1" << endl;
    }
    else
    {
        backtrack1(m, s, 0);
        cout << result2 << " " << result1 << endl;  
    }
    return 0;
}

原理思路:

        不要用回溯,数据过大就会超时的,比如100,100。就不解释这种方法了,而且麻烦又不对。

贪心:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int m;//组成个数
    int s;//数
    cin >> m;
    cin >> s;
    //排除无解
    if((s > m * 9) || (s == 0 && m > 1))
    {
        cout << "-1 -1" << endl;
    }
    else
    {
        int sum = s;
        string a(m, ' ');//最大
        string b(m, ' ');//最小
        for(int i = 0; i < m; i++)
        {
            int t = min(sum, 9);
            a[i] = t + '0';
            sum -= t; //用过的去掉
        }
        
        sum = s;//别忘了这里再给sum赋一下值
        for(int i = m - 1; i > 0; i--)
        {
            int t = min(sum - 1, 9);//9 和 sum 之间取最小,给最高位至少留一个1,最高位不能为0,当然最高位不一定为1
            b[i] = t + '0';
            sum -= t;
        }
        b[0] = sum + '0';//最后把第一位添上
        cout << b <<" "<< a;
    }
    return 0;
}

原理思路:

        求最大,就从第一位开始取,能取多大取多大,最大不是 9 么,但是肯定不能超过 sum 吧,所以就在这两个之间取最小就行。

        求最小,正好相反,从最后一位开始取,记得sum要留一个1,因为首位不能为 0 吧,所以最小就为1,不过首位也不一定为 1,所以最后剩多少就直接赋值就行。

4808. 构造字符串

问题描述:

        给定一个长度为 n 的由小写字母构成的字符串 t 以及一个整数 k。

请你构造一个字符串 s,要求:

  1. 字符串 s 恰好有 k 个子串等于字符串 t。
  2. 字符串 s 的长度尽可能短。

保证一定存在唯一解。

实现代码与解析:

kmp:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    string s;
    int k;
    cin >> n;
    cin >> k;
    cin >> s;
    string result = "";

    //求next数组
    vector<int> next(n, 0);
    int j = 0;
    next[0] = 0;
    for (int i = 1; i < n; i++)
    {
        while (s[i] != s[j] && j > 0) j = next[j - 1];
        if (s[i] == s[j]) j++;
        next[i] = j;
    }

    string diff = s.substr(0, n - next[n - 1]);//后缀部分
    //把非后缀部分先重复 k  加上
    for (int i = 0; i < k  ; i++)
    {
        result += diff;
    }
    result += s.substr(0, next[n - 1]);//最后再加一个最长公共后缀
    cout << result << endl;
}

原理思路:

        很简单啊,明显就是kmp,当然可能也有其他做法吧,kmp找出最长公共前后缀,然后找规律就可以,根据样例,可以看出,可以结果先加上非后缀部分 k 个,然后补上后缀,或则先加上前缀,然后再加上 k 个非前缀部分,一样的,找个规律而已。例如例子一中,可以 a ba ba ba ba这样或则 ab ab ab ab a 这样模拟,都可以。其他就没什么了,会 kmp 这题就应该会了,要是不会就建议去网上查一下,kmp 不同习惯的写法也不一样。

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

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

相关文章

53. 最大子数组和

文章目录题目描述暴力法动态规划法分治法参考文献题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&…

JavaScript中数组常用的方法

文章目录前言常用数组方法1、 join( )2、push&#xff08;&#xff09;与 pop&#xff08;&#xff09;3、shift&#xff08;&#xff09;与 unshift&#xff08;&#xff09;4、sort&#xff08;&#xff09;5、reverse&#xff08;&#xff09;6、slice&#xff08;&#xff…

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II

一、参考资料复原IP地址题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解&#xff1a;https://programmercarl.com/0078.…

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 一个骰子&#xff0c;从3个不同角度看过去的点数如图所示&#xff0c;请问5的对面是什么点数&#xff1f;&#xff08; &#xff09; …

数据库(单表查询)

素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NOT NUL…

【C语言技能树】程序环境和预处理

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

一文掌握,单机Redis、哨兵和Redis Cluster的搭建,建议收藏

本篇文章讲述了 Redis 单机环境、主备、哨兵 Sentinel 模式以及 Redis Cluster 集群模式下的操作步骤&#xff0c;关于这些操作我们没必要死记硬背&#xff0c;只需要总结下来&#xff0c;下次使用直接拿出来就好。建议当作操作手册收藏。安装单实例 Redis编译Redis1.下载Redis…

小白都能学会的红帽(RedHat8)RHEL8系统安装实战

文章目录前言一. 实验环境二. 安装虚拟机三. 安装操作系统四. 系统安装成功后的操作总结前言 本文是应一位大佬的提议&#xff0c;建议我写写红帽系列&#xff0c;centos8已经不维护了&#xff0c;centos7 维护到2024年6月30日&#xff0c; 也就是明年的事情了&#xff0c;所以…

【Flutter入门到进阶】Dart基础篇---基于对比Java学习Dart

1 Dart语言特性 1.1 简介 1.1.1 说明 2011年10月&#xff0c;在丹麦召开的 GOTO 大会上&#xff0c;Google 发布了一种新的编程语言 Dart 。如同 Kotlin 和 Swift 的出现&#xff0c;分别是为了解决 Java 和 Objective-C 在编写应用程序的一些实际问题一样&#xff0c;Dart 的…

算法笔记(二)—— 认识N(logN)的排序算法

递归行为的时间复杂度估算 整个递归过程是一棵多叉树&#xff0c;递归过程相当于利用栈做了一次后序遍历。 对于master公式&#xff0c;T(N)表明母问题的规模为N&#xff0c;T(N/b)表明每次子问题的规模&#xff0c;a为调用次数&#xff0c;加号后面表明&#xff0c;除去调用之…

八股初始:RocketMQ

一、消息队列介绍 消息队列是什么 对于 MQ 来说&#xff0c;其实不管是 RocketMQ、Kafka 还是其他消息队列&#xff0c;它们的本质都是&#xff1a;一发一存一消费。 将 MQ 掰开了揉碎了来看&#xff0c;都是「一发一存一消费」&#xff0c;再直白点就是一个「转发器」。生产…

记一次上环境获取资源失败的案例

代码结构以及资源位置 测试代码 RestController RequestMapping("/json") public class JsonController {GetMapping("/user/1")public String queryUserInfo() throws Exception {// 如果使用全路径, 必须使用/开头String path JsonController.class.ge…

《计算机组成与设计》03. 计算机的算术运算

文章目录整数运算加法与减法乘法普通十进制乘法硬件中实现步骤例子乘法器的设计除法普通十进制除法硬件中实现步骤例子除法器的设计浮点数运算科学计数法、规格化数浮点表示单精度浮点数双精度浮点数移码表示法IEEE 754指数偏移值&#xff08;exponent bias&#xff09;规格化的…

计算机网络4:计算机网络体系结构

目录计算机网络体系结构1.网络模型2.每一层的代表含义2.1 OSI7层模型2.2 五层协议2.3 TCP/IP 四层协议3.数据在各层之间的传输过程4.为什么要进行分层计算机网络体系结构 1.网络模型 2.每一层的代表含义 2.1 OSI7层模型 &#xff08;1&#xff09;物理层&#xff1a;比特流–…

STC15中断系统介绍

STC15中断系统介绍✨本篇参考来源于STC官方stc15系列手册:538页- 589页。&#xff08;文末提供该摘取部分的文档资料&#xff09; &#x1f389;在官方提供的手册资料中&#xff0c;一个系列一份手册&#xff0c;手册内容涵盖了数据手册和参考手册以及例程案例。对于学习着来说…

彻底搞懂分布式系统服务注册与发现原理

目录 引入服务注册与发现组件的原因 单体架构 应用与数据分离

火遍全球的ChatGPT技术简介与主干网络代码

如果说当下最火的AI技术和话题是什么&#xff0c;恐怕很难绕开ChatGPT。各大厂商都在表示未来要跟进ChatGPT技术&#xff0c;开发在自然语言处理智能系统&#xff0c;可见其影响力。本篇博客追个热度&#xff0c;来简单的介绍下ChatGPT到底是一项什么技术&#xff0c;究竟如何完…

深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

【网络编程】Java中的Socket

文章目录前言socket是什么&#xff1f;Java中的SocketJava实现网络上传文件前言 所谓Socket&#xff08;套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用…