Сформируйте минимальное число из заданной последовательности I и D - PullRequest
3 голосов
/ 14 июля 2020

Дана последовательность, состоящая из «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: IIDDD    Output: 126543
   Input: DDIDDIID Output: 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;
}

Например, когда я ввожу DD в код C ++, он дает 111, но должен вывести 321.

1 Ответ

4 голосов
/ 14 июля 2020

ans.size() в C ++ возвращает 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, преобразование без знака в знак может быть определено реализацией, но это должно работать в большинстве (всех?) случаев для ваших примеров. From [conv.integral]/3:

Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения; в противном случае значение определяется реализацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...