从给定的 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。

C++中的

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:

如果目标类型是签名的,则如果可以在目标类型中表示,则值不变;否则,该值由实现定义。