我接到了一个 C++ 任务来接收一串数字。
我要做的是将该数字的第一位移到最后一位。
例如,如果数字是 1234,它应该是 2341 这样的。
我还要做的是使数字序列不增加。
为了更好地理解这里是我必须做的:
输入:
1934
7815
第 1894 章
6518
3281
在第一个示例中,我们将执行以下操作:
1 move on x1 : 1934 -> 9341
1 move on x2 : 7815 -> 8157
3 move on x3 : 1894 -> 8941 -> 9418 -> 4189
2 move on x4 : 6518 -> 5186 -> 1865
3 move on x5 : 3281 -> 2813 -> 8132 -> 1328
The final sequence will be 9341 ≥ 8157 ≥ 4189 ≥ 1865 ≥ 1328.
如果可以生成这样的非递增序列,程序应该打印 yes,否则我应该打印 no。
这是我尝试过的:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s[5];
for (int i = 0; i < 5; i++)
{
cin >> s[i];
}
for (int j = 0; j < 5; j++)
{
rotate(s[j].begin(), s[j].begin() + 1, s[j].end());
}
for (int j = 2; j < 5; j++){
while (s[j-1] <= s[j]){
rotate(s[j].begin(), s[j].begin() + 1, s[j].end());
}
}
for (int i = 0; i < 5; i++)
cout << s[i] << endl;
}
我做了所有的 Action ,然后打印出来,我不知道如何检查是否可以做一个非递增的序列。同样根据我的逻辑,如果我不能生成非递增序列,while 循环可能是无限循环,如何解决?谢谢。
最佳答案
这是解决这个问题的一种方法:
将第一个数字旋转到可能的最大值。
例如对于号码
1894
有 4 种可能的旋转:{1894, 8941, 9418, 4189}
.最大的一个是9418
.对于其余数字,将它们旋转到等于或小于为前一个数字选择的旋转的最大可能值。如果没有这样的旋转,那么顺序是不可能的。
以你的例子为例:
-
1934
:最大的旋转是9341
-
7815
: 最大旋转<= 9341
是8157
-
1894
: 最大旋转<= 8157
是4189
-
6518
: 最大旋转<= 4189
是1865
-
3281
: 最大旋转<= 1865
是1328
关于c++ - 如何检查这是否构成非递增序列。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603192/