2 jiayoulaofu jiayoulaofu 于 2016.05.06 21:42 提问

刷华为上机题库时遇到的一道编程题

题目的要求是输入一个字符串,对字符串做如下变化
1:按照A-Z的顺序条换顺序,不管字母的大小写。如Type变换为epTy
2:同一个英文字母的大小写同时存在时,按照输入顺序排列。如输入:BabA 输出:aABb
3:非英文字母的其它字符保持原来的位置。输入:By?e 输出:Be?y

#include "iostream"
#include "string"
using namespace std;

bool combine(char x,char y)
{
int z=1;
int i, j;
if (isupper(x))
i = 1;
else
i = 0;

if (isupper(y))
    j = 1;
else
    j = 0;

if (i == 0 && j == 0)
{
    if (x > y)
        z = 0;
}
else if (i == 1 && j == 0)
{
    if (x + 32 > y)
        z = 0;
}
else if (i == 0 && j == 1)
{
    if (x > y + 32)
        z = 0;
}
else if (i == 1 && j == 1)
{
    if (x > y)
        z = 0;
}

if (z == 1)
    return false;
else
    return true;

}

int main()
{
string x;
getline(cin, x);
int m = x.size();
for (int i = 0; i < m - 1; i++)
{
if (isalpha(x[i]))
{
for (int j = i + 1; j < m; j++)
{
if (isalpha(x[j]))
{
if (combine(x[i], x[j]))
{
char z;
z = x[i];
x[i] = x[j];
x[j] = z;
}
}
}
}

}
for (int i = 0; i < m; i++)
cout << x[i];
}

这是我写的代码 但是一直不满足第二条要求。能不能帮我看一下代码哪里出了问题?

3个回答

caozhy
caozhy   Ds   Rxr 2016.05.06 23:33

先mark下,回头帮你看看。

NK_test
NK_test   Rxr 2016.05.06 23:47

给你提供一个思路,手机码字就不写代码了。
时间复杂度高一些,但是满足需求:对A(a)—Z(z)依次遍历,在字符串中找到他们的位置下标并记录(特殊符号也需记录),然后就可以依次按下标输出,注意遇到特殊符号的下标时,要输出特殊符号,如此即可。

qq423399099
qq423399099   Ds   Rxr 2016.05.07 12:54

主要的问题在于楼主对于不是相邻的元素并且这两个字符之前包含同一个字母的大小写的话不能直接交换元素值,否则的话会破坏原来的顺序
比如第二条BabA ->aBbA -> aAbB
第一次交换是没问题的,第二次AB交换就有问题了,破坏了原来Bb排列的顺序
所以对于不是相邻的元素,可以采用元素依次向后挪位的方式

 #include "iostream"
#include "string"
using namespace std;
bool combine(char x,char y)
{
    int z=1;
    int i, j;
    if (isupper(x))
        i = 1;
    else
        i = 0;
    if (isupper(y))
        j = 1;
    else
        j = 0;

    if (i == 0 && j == 0)
    {
        if (x > y)
            z = 0;
    }
    else if (i == 1 && j == 0)
    {
        if (x + 32 > y)
            z = 0;
    }
    else if (i == 0 && j == 1)
    {
        if (x > y + 32)
            z = 0;
    }
    else if (i == 1 && j == 1)
    {
        if (x > y)
            z = 0;
    }

    if (z == 1)
        return false;
    else
        return true;
}
int main()
{
    string x;
    getline(cin, x);
    int m = x.size();
    for (int i = 0; i < m - 1; i++)
    {
        if (isalpha(x[i]))
        {
            for (int j = i + 1; j < m; j++)
            {
                if (isalpha(x[j]))
                {
                    if (combine(x[i], x[j]))
                    {
                        if(j - i == 1)
                        {
                            char z;
                            z = x[i];
                            x[i] = x[j];
                            x[j] = z;
                        }
                        else
                        {
                            char z;
                            z = x[j];
                            for(int k = j; k > i; k--)
                                x[k] = x[k - 1];
                            x[i] = z;
                        }
                    }
                }
            }
        }

    }
    for (int i = 0; i < m; i++)
        cout << x[i];
}
Csdn user default icon
上传中...
上传图片
插入图片