Python 从给定的I'序列中形成最小数;s和D';s
给定一个由“I”和“D”组成的序列,其中“I”表示递增序列,“D”表示递减序列。编写一个程序,对给定的序列进行解码,以构造最小数,而不重复数字。 数字应从1开始,即不应有零。Python 从给定的I'序列中形成最小数;s和D';s,python,c++,algorithm,vector,Python,C++,Algorithm,Vector,给定一个由“I”和“D”组成的序列,其中“I”表示递增序列,“D”表示递减序列。编写一个程序,对给定的序列进行解码,以构造最小数,而不重复数字。 数字应从1开始,即不应有零。 Input: D Output: 21 Input: I Output: 12 Input: DD Output: 321 Input: II Output: 123 Input: DIDI Output: 21435 Input:
Input: D Output: 21 Input: I Output: 12 Input: DD Output: 321 Input: II Output: 123 Input: DIDI Output: 21435 Input: IIDDD Output: 126543 Input: DDIDDIID Output: 321654798 C++代码(不工作,即没有给出正确的输出)
#包括
使用名称空间std;
矢量数字(字符串s){
向量ans={1};
整数计数=0;
用于(字符常量和c:s){
如果(c=='I'){
计数=0;
int k=ans.size();
ans.推回(k+1);
}
否则{
计数++;
int tmp=ans.back();
对于(int i=ans.size()-1;i>ans.size()-1-计数;i--){
ans[i]+=1;
}
ans.push_back(tmp);
}
}
返回ans;
}
int main(){
字符串s;
cin>>s;
矢量ans=数字;
对于(int i=0;i ANS Ssiz()/Cuth>在C++中返回一个<代码> SsieZiT,它是未签名的(根据您的配置,32位或64位)。您可以简单地将<代码> ANS SIZE()/<代码> > <代码> int >代码>以修复您的问题,如:
for ( int i = static_cast<int>(ans.size()) - 1; i > static_cast<int>(ans.size()) - 1 - count; i-- )
for(int i=static_cast(ans.size())-1;i>static_cast(ans.size())-1-count;i--)
使用调试器,您可以检查您是否从未真正进入for循环
的主体中进行输入
正如程序员所指出的,无符号到有符号的转换可能是实现定义的,但对于您的示例来说,这在大多数(所有?)情况下都应该有效。
从[conv.integral]/3
:
如果目的地类型是有符号的,如果可以在目的地类型中表示,则该值不变;
否则,该值由实现定义
“不工作”是什么意思?它没有给出正确的输出@ChrisMMDon不要添加“编辑”或“更新”到您的问题。只需完成问题。如果需要了解编辑历史记录是如何更改的,我们可以查看编辑历史记录。您应该向代码中添加一些打印语句以监视变量的值,或者使用调试器!您的for循环从未被输入,因为ans.size()-1-count
导致整数下溢为ans.size()返回一个<代码> STD::SigZyt < /Cube >,它是一个无符号的整数。@ JuthStalOnter在一个不相关的注释上,只是一个注释,它是未定义的,以签名的形式是实现的。@ NotAProgrammer,你能用一个例子来详细说明一下吗?我不明白。@ JuStAutoLee,用C++的引用来查看我的编辑。r仅适用于无符号类型范围之外的值。似乎不太可能ans.size()
将大于int
的最大值,特别是假设int
至少为32位(可能是这样)。@其他人可能会对此(以及线程)有更多的了解.但不,我想不出什么时候使用小数值非负数会导致问题。当然,在你的例子中,你试图将-1赋给一个无符号整数,这会导致问题。
#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;
}
for ( int i = static_cast<int>(ans.size()) - 1; i > static_cast<int>(ans.size()) - 1 - count; i-- )