字典序问题

1,还有点小问题。

2,传数组的话只要传数组名就可以了。我都想重修C语言了。。

3,有点烦啊没有输出,好像也没有结束那个符号。自己的问题!

4,

#include<iostream>
#include<bits/stdc++.h> 
using namespace std;
const int maxn=1005;
int n;
char C[maxn];
char T[maxn];
void solve(char c[])
{
    int a=0;
    int b=n-1;
    while(a<=b)
    {
        bool left=false;
        for(int i=0;a+i<=b;i++){
            if(c[a+i]<c[b-i]){
                left=true;
                break;
            } 
            else if(c[a+i]>c[b-i]){
                left=false;
                break;
            }
    }
    if(left) putchar(c[a++]);//这个是先输出再自加 
    else putchar(c[b--]);
}
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>C[i];
    solve(C);
}

5,但是我觉里面那些细节条件我绝对没搞清。

还有人家算法思想是那样,但是人家的实现真的很简单的。

6,代码细节看起来还是挺难理解的。不过不是说好的先背先抄代码么

7,你能出现这种错误说明你对代码的理解太差了。。。这个错误我最终总结为。。。嗯。。题意的问题啊。是要加到尾部!!!

而且是字典序尽可能小的好不!

8,我来们费大

其实我觉得可以用选数的IF-ELSE来解释。但是这样的话,会产生更多的时间复杂度和空间。虽然它这个思想确实是这个样子。我去我第二步都没有做完全。。OJ上是compiler error 和 presentation error。。。我真是的。

9,碰上问题不要急,一个方法试了几下就要去找其他方法。

比如这个坑爹。。原题还有条件呢。。行了费大。就选数的那个IF-ELSE那种结构思想。

10,至于代码细节,我很推荐你去用样例然后在纸上模拟一遍这样我会有一个好的理解~!

11,费大还是不好。为什么呢?你想每次从原字符串首尾取字典序最小的,是否考虑了相等的情况,相等的情况下又该怎么设计程序。原题意不就是这样吗?据我所感觉,一般的题都有坑,像这个往前进一步,将字符串反转来比较,确实解决了。不过我突然又觉得相等无所谓?

还是有点思维难度的吧?但是,相等是有所谓的,因为我们基于的是求字典序最小的字符串,因此我们要尽早地使用更小的字符。我之前还确实没有认识到这点。k

一串本身就带有一个可比较属性的东西。可以想象成数字?抽象出来这个题这个东西的本质上的东西,其实就是比较它们所代表的数字。

所以这个就叫数字比较问题。这个费大还可以。

12,至于费小,用样例模拟了一下,倒是几个点都比较明确了。

不过你改不了代码的话,那就还是不行。。。

while(a<=b)//因为你要比较两边嘛,a<=b还是可以的 
    {
        for(int i=0;a+i<=b;i++)//a+i是因为你比较最后一个的话,总是在循环。 
        {
            
            if(c[a+i]<c[b-i])
            {
                left=true;
                cnt++;
                break;
            }
            else if(c[a+i]>c[b-i])
            {
                left=false;
                cnt++;
                break;
            }//中间这一大部分就是正常情况以及有首尾相等的话看下一个 
        }

不清楚的话最好用样例在纸上模拟一遍就清楚了。当然这是不够的!

嗯我改了,果然for中的a+i<=b是承接上面的a=b的。然后我改成a+i<=b也过了 哈哈。

我觉得这个算数哈哈

13,

#include<iostream>
using namespace std;
const int maxn=100005;
int n;
char S[maxn];
int cnt=0;
void solve(char c[])
{
    int a=0;
    int b=n-1;
    bool left=false;
    while(a<=b)//因为你要比较两边嘛,a<=b还是可以的 
    {
        for(int i=0;a<=b-1;i++)//a+i是因为你比较最后一个的话,总是在循环。 
        {
            
            if(c[a+i]<c[b-i])
            {
                left=true;
                cnt++;
                break;
            }
            else if(c[a+i]>c[b-i])
            {
                left=false;
                cnt++;
                break;
            }//中间这一大部分就是正常情况以及有首尾相等的话看下一个 
        }
        if(left) cout<<c[a++];
        else cout<<c[b--];
        if(cnt % 80 == 0)
        cout<<endl;
    }
     
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>S[i];
    solve(S);
    
}

14,

原文地址:https://www.cnblogs.com/beiyueya/p/12127085.html