【C++刷题】优选算法——模拟

2024-06-06 06:36
文章标签 算法 c++ 模拟 刷题 优选

本文主要是介绍【C++刷题】优选算法——模拟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 替换所有的问号
string modifyString(string s)
{if (s.size() == 1){if (s[0] != '?') return s;else return "a";}for (int i = 0; i < s.size(); ++i){if (s[i] == '?') // 遇到'?'{if (i != 0) // '?' 不在 0 位置 说明左边有字母{if (i + 1 < s.size()) // 说明右边有元素{for (int c = 'a'; c <= 'z'; ++c){if (s[i - 1] != c && s[i + 1] != c){s[i] = c;break;}}}else // 右边没有元素{for (int c = 'a'; c <= 'z'; ++c){if (s[i - 1] != c){s[i] = c;break;}}}}else // '?' 在 0 位置 (此时右边肯定有元素){if (s[i + 1] != '?') // 右边元素是字母{for (int c = 'a'; c <= 'z'; ++c){if (s[i + 1] != c){s[i] = c;break;}}}else // 右边元素是'?'{s[i] = 'a';}}}}return s;
}
  1. 提莫攻击
int findPoisonedDuration(vector<int>& timeSeries, int duration)
{int time = 0;int start = timeSeries[0], end = start + duration - 1; // [start, end]for(int i = 1; i < timeSeries.size(); ++i){if(timeSeries[i] <= end){end = timeSeries[i] + duration - 1;}else{time += end - start + 1;start = timeSeries[i];end = start + duration - 1;}}time += end - start + 1;return time;
}int findPoisonedDuration(vector<int>& timeSeries, int duration)
{int time = 0;for(int i = 1; i < timeSeries.size(); ++i){int interval = timeSeries[i] - timeSeries[i-1];if(interval >= duration) time += duration;else time += interval;}return time + duration;
}
  1. Z 字形变换
// tips:当发现一个模拟策略复杂度太高,大多数情况下都是在模拟中找规律来进行优化
string convert(string s, int numRows)
{if(s.size() <= numRows || numRows == 1) return s;string ret;int interval = 2 * numRows - 2; // 公差间隔for(int i = 0; i < s.size(); i += interval) ret += s[i];for(int i = 1; i < numRows - 1; ++i){for(int left = i, right = interval - left; left < s.size() || right < s.size(); left += interval, right += interval){if(left < s.size()) ret += s[left];if(right < s.size()) ret += s[right];}}for(int i = numRows - 1; i < s.size(); i += interval) ret += s[i];return ret;
}
  1. 外观数列
string RLE(const string& str)
{string ret;int start = 0, end = start + 1;for( ; end < str.size(); ++end){if(str[end] != str[start]){ret += to_string(end - start);ret += str[start];start = end;}            }ret += to_string(end - start);ret += str[start];return ret;
}
// 递归
string countAndSay(int n)
{if(n == 1) return "1";return RLE(countAndSay(n-1));
}
// 迭代
string countAndSay(int n)
{string ret = "1";for(int i = 2; i <= n; ++i){ret = RLE(ret);}return ret;
}
  1. 数青蛙
int minNumberOfFrogs(string croakOfFrogs)
{unordered_map<char, int> hash = {{'c', 0},{'r', 1},{'o', 2},{'a', 3},{'k', 4}};vector<int> v(5);for(char ch : croakOfFrogs){if(ch != 'c'){if( v[ hash[ch] - 1 ] != 0 ){v[hash[ch]]++;v[hash[ch] - 1]--;}else return -1;}else // ch == 'c'{if( v[hash['k']] > 0 ) v[hash['k']]--;v[hash['c']]++;}}for(int i = 0; i < v.size() - 1; ++i){if(v[i] != 0) return -1;}return v[hash['k']];
}

这篇关于【C++刷题】优选算法——模拟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程