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

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

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)