从给定的 I 和 D 序列中形成最小数
Form minimum number from the given sequence of I's and D's
本文关键字:小数 更新时间:2023-10-16
给定一个由"I"answers"D"组成的序列,其中"I"表示递增序列,"D"表示递减序列。编写一个程序,对给定的序列进行解码,以构建没有重复数字的最小数字。数字应从1开始,即不应有零
输入:D输出:21输入:I输出:12输入:DD输出:321输入:II输出:123输入:DIDI输出:21435输入:IIDDD输出:126543输入:DDIDDIID输出:321654798
我的python代码可以工作。我把它翻译成了C++,但C++版本不起作用。我不明白为什么。
Python代码(作品(:
s = input()
ans = [1]
count = 0
for i in s:
if i == 'I':
count = 0
k = len(ans)
ans.append(k + 1)
else:
count += 1
tmp = ans[-1]
for i in range(-1, -1 - count, -1):
ans[i] += 1
ans.append(tmp)
for i in ans:
print(i, end = "")
C++代码(不工作,即没有给出正确的输出(
#include <bits/stdc++.h>
using namespace std;
vector<int> digits(string s){
vector<int> ans = {1};
int count = 0;
for (char const &c : s){
if (c == 'I'){
count = 0;
int k = ans.size();
ans.push_back(k + 1);
}
else{
count ++;
int tmp = ans.back();
for (int i = ans.size() - 1; i > ans.size() - 1 - count; i--){
ans[i] += 1;
}
ans.push_back(tmp);
}
}
return ans;
}
int main(){
string s;
cin >> s;
vector<int> ans = digits(s);
for (int i = 0; i < ans.size(); i++){
cout << ans[i];
}
return 0;
}
当我在C++代码中输入DD时,它给出111,但它应该输出321。
ans.size()
返回一个无符号的size_t
(32位或64位,具体取决于您的配置(。您可以简单地将ans.size()
转换为int
来解决您的问题,如下所示:
for ( int i = static_cast<int>(ans.size()) - 1; i > static_cast<int>(ans.size()) - 1 - count; i-- )
使用调试器,您可以检查您的输入是否从未真正进入for-loop
的主体。
正如NotAProgrammer所指出的,无符号到有符号的转换可能是由实现定义的,但对于您的示例来说,这应该在大多数(所有?(情况下都有效。来自[conv.integral]/3
:
如果目标类型是签名的,则如果可以在目标类型中表示,则值不变;否则,该值由实现定义。
相关文章:
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 返回浮点数的小数位数
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 在数学上将浮点数四舍五入到 N 位小数
- 打印双精度的整个非小数部分
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如何在C++中对OpenCV垫的小数进行四舍五入?
- 将 int 数组转换为带有小数C++的双精度数组
- Arduino如何制作返回固定大小数组的函数
- 从浮点数中删除小数部分但保留类型的有效方法
- 分配新的零大小数组可以具有有效价值吗?
- c++只关心2位小数,没有设置精度
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- gcc c++编译器中的零大小数组
- 给出了一个数的确切除数(n),如何确定具有n个除数的最小数?