c++ - 如何检查这是否构成非递增序列。

标签 c++

我接到了一个 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 : 最大旋转<= 93418157
  • 1894 : 最大旋转<= 81574189
  • 6518 : 最大旋转<= 41891865
  • 3281 : 最大旋转<= 18651328

关于c++ - 如何检查这是否构成非递增序列。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603192/

相关文章:

c++ - Qt中的信号和槽

c++ - 解决方案中有两个独立项目的 visual studio c++ 问题?

python - 使用 C++,如何在 Qt Designer 中运行 python 文件?

c++ - 如何将 wstring 转换为字符串?

c++ - 智能指针 : cast between base and derived classes

c++ - 变量 'sortArray'周围的堆栈已损坏

c++ - 实现 Dijkstra 算法

c++ - 函数签名中忽略的部分特化非顶级 cv 限定符

c++ - 为什么我不能在另一个函数中定义一个函数?

c++ - 宏的重写以遵循 C++ 约定