9.15( 31.(数组)题目:下一个排列 12.(字符串)整数转罗马数字)

2024-03-30 01:32

本文主要是介绍9.15( 31.(数组)题目:下一个排列 12.(字符串)整数转罗马数字),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

31.(数组)题目:下一个排列

思路:

1.从后向前遍历数组,相邻数值比较。找到第一个满足a[i]<a[i+1]的i,并标记为tmp;
2.如果tmp==0:说明原字符串是从大到小排序的,只需要使用冒泡排序翻一下序列就行了。因为不能占用额外的空间,所以我选择了冒泡排序,使用快速排序也可以,但是不能使用归并排序;
如果tmp!=0:从tmp后面的位置开始对原字符串进行排序。排完之后,选择第一个大于a[tmp]的数字和a[tmp]进行交换即可;

代码如下:
class Solution {
public:void nextPermutation(vector<int>& nums) {int n = nums.size();int tmp = 0;//记录元素下标int flag = 0;//这个初始化表示最终是按照从大到小排列for (int i = nums.size()-2; i >= 0; i--) {if (nums[i] >= nums[i + 1]);else {tmp = i;//记录下第一个比后面小的元素下标flag = 1;break;//找到之后立即退出}    }if (flag == 1) {//把最开始的和后面的大于它的交换for (int i = 0; i < nums.size() - tmp - 1; i++) {for (int j = tmp + 1; j < nums.size() - i - 1; j++) {//按照升序排列if (nums[j] > nums[j + 1])swap(nums[j], nums[j + 1]);}}for (int i = tmp + 1; i < nums.size(); i++)if (nums[i] > nums[tmp]) {swap(nums[tmp], nums[i]);//交换前两个元素的位置break;}}else {//表示把原本的字符串反过来就行了for (int i = 0; i < nums.size() - tmp; i++) {for (int j = tmp; j < nums.size() - i - 1; j++) {//按照升序排列if (nums[j] > nums[j + 1])swap(nums[j], nums[j + 1]);}}}}void swap(int &a, int &b) {int t = a;a = b;b = t;//在原位交换两个元素的内容}
};

12.(字符串)整数转罗马数字

思路:

1.类似于数值在十进制下的逐位分解,只是本道题不是1000,100,10这种
,而是1000,900,500,400,100,90,50,40,10,9,5,4,1这种。

代码如下:
class Solution {
public:string intToRoman(int num) {int count;//表示字符串加的次数int i = 0;int a[13] = { 1000,900,500,400,100,90,50,40,10,9,5,4,1 };string b[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};string s="";//表示目标字符串while (num!=0) {count = num / a[i];while (count--) {//这个可以s += b[i];}num = num % a[i];i++;}return s;}};

这篇关于9.15( 31.(数组)题目:下一个排列 12.(字符串)整数转罗马数字)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然