【错题集-编程题】重排字符串(贪心 + 构造)

2024-04-30 04:44

本文主要是介绍【错题集-编程题】重排字符串(贪心 + 构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

牛客对应题目链接:重排字符串 (nowcoder.com)

力扣对应题目链接:1054. 距离相等的条形码 - 力扣(LeetCode)


一、分析题目


二、代码

1、没看题解之前AC的代码

//牛客代码(看了题解之后AC的代码)
#include <iostream>
#include <unordered_map>
using namespace std;int main()
{int n;cin >> n;string s;cin >> s;string res=s;char maxValue=0;int maxCount=0;unordered_map<char, int> hash;for(auto x : s){hash[x]++;if(hash[x]>maxCount){maxCount=hash[x];maxValue=x;}}int k=0;while(maxCount--){res[k]=maxValue;if(k>=n){cout << "no" << endl;return 0;}k+=2;}hash[maxValue]=0;for(auto& [a, b] : hash){while(b>0){if(k>=n) k=1;res[k]=a;k+=2;b--;}}cout << "yes" << endl;cout << res << endl;return 0;
}//力扣AC代码
class Solution {
private:unordered_map<int, int> hash;
public:vector<int> rearrangeBarcodes(vector<int>& barcodes) {int n=barcodes.size();vector<int> res(n);int maxValue=0;int maxCount=0;for(auto x : barcodes){hash[x]++;if(hash[x]>maxCount){maxCount=hash[x];maxValue=x;}}int k=0;while(maxCount--){res[k]=maxValue;k+=2;}hash[maxValue]=0;for(auto& [a, b] : hash){while(b>0){if(k>=n) k=1;res[k]=a;k+=2;b--;}}return res;}
};

2、值得学习的代码

//牛客
#include <iostream>using namespace std;const int N = 100010;int n;
char s[N];
char ret[N];int main()
{cin >> n >> s;int hash[26] = { 0 }; // 统计每个字符的频次int maxIndex, maxCount = 0;for(int i = 0; i < n; i++){if(maxCount < ++hash[s[i] - 'a']){maxCount = hash[s[i] - 'a'];maxIndex = s[i] - 'a';}}if(maxCount > (n + 1) / 2) cout << "no" << endl;else{cout << "yes" << endl;int index = 0;// 先去摆放出现次数最多的while(maxCount--){ret[index] = maxIndex + 'a';index += 2;}// 处理剩下的for(int i = 0; i < 26; i++){if(hash[i] && i != maxIndex){while(hash[i]--){if(index >= n) index = 1;ret[index] = i + 'a';index += 2;}}}// 打印结果for(int i = 0; i < n; i++) cout << ret[i];cout << endl;}return 0;
}

三、反思与改进

因为这道题目之前在力扣上做过类似的,所以基本思路很清晰,不过最后不知道是哪块细节没有处理好,导致只过了 33.33% 的样例。崩溃了,看了题解之后,发现是在正解前面少打印了一个 "yes",审题不仔细!!这种低级错误不能再犯,否则以后笔试会吃大亏!

这篇关于【错题集-编程题】重排字符串(贪心 + 构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947930

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2