【问题标题】:how to sort 3 strings with only 3 if statement (C++)如何仅使用 3 个 if 语句对 3 个字符串进行排序(C++)
【发布时间】:2021-06-18 07:16:42
【问题描述】:

我需要帮助比较 3 个字符串,但只使用 3 个 if 语句

我可以使用 5 个 if 语句编写

如果有人知道如何解决,我将非常感激

string a, b, c;
if( a>b && a>c ){
  if(b>c)
    cout << a << b << c;
  else
    cout << a << c << b;
}
else if( b>c && b>a ){
  if(a>c)
    cout << b << a << c;
  else
    cout << b << c << a;
}
else{
   if(a>b)
    cout << c << a << b;
  else
    cout << c << b << a;
}

【问题讨论】:

  • 使用ternary operator 代替一些ifs?
  • 如果你想真正对字符串进行排序(重新排序它们的值),可以使用 3 个 if 语句来完成。

标签: c++ string sorting if-statement


【解决方案1】:

使用 3 个 2-way 分支会将执行路径分隔为只有 4 个 way,所以不可能只使用 3 个 2-way 分支来生成 6 个 putterns 的输出。

一种解决方法是使用ternary operators 而不是一些ifs。

string a, b, c;
if( a>b && a>c ){
  b>c ? cout << a << b << c : cout << a << c << b;
}
else if( b>c && b>a ){
  a>c ? cout << b << a << c : cout << b << c << a;
}
else{
   if(a>b)
    cout << c << a << b;
  else
    cout << c << b << a;
}

另一种选择是将比较结果编码为一个整数并使用switch 根据结果生成正确的输出。

string a, b, c;
int res = 0;
if(a>b) res += 1;
if(a>c) res += 2;
if(b>c) res += 4;
switch(res){
    case 0: // a<=b && a<=c && b<=c
        cout << b << c << a;
        break;
    case 1: // a>b && a<=c && b<=c
        cout << c << a << b;
        break;
    case 2: // a<=b && a>c && b<=c
        // invalid
        break;
    case 3: // a>b && a>c && b<=c
        cout << a << c << b;
        break;
    case 4: // a<=b && a<=c && b>c
        cout << b << c << a;
        break;
    case 5: // a>b && a<=c && b>c
        // invalid
        break;
    case 6: // a<=b && a>c && b>c
        cout << b << a << c;
        break;
    case 7: // a>b && a>c && b>c
        cout << a << b << c;
        break;
}

【讨论】:

    【解决方案2】:
    if(a>b && a>c){
      (b>c)?cout << a << b << c:cout << a << c << b;
    }
    else if( b>c && b>a ){
      (a>c)?cout << b << a << c:cout << b << c << a;
    }
    else{
       (a>b)?cout << c << a << b:cout << c << b << a;
    }
    

    对于嵌套的 if-else 情况,您可以尝试三元运算符

    【讨论】:

    • 一般来说代码是不正确的。那是对于某些值,它会输出错误的序列。
    【解决方案3】:

    如果您被允许交换字符串,则代码可以如下面的演示程序所示如下所示

    #include <iostream>
    #include <string>
    #include <utility>
    
    int main() 
    {
        std::string a( "2" ), b( "1" ), c( "3" );
        
        if ( b < a ) std::swap( a, b );
        if ( c < b ) std::swap( b, c );
        if ( b < a ) std::swap( a, b );
        
        std::cout << a << ' ' << b << ' ' << c << '\n';
    
        return 0;
    }
    

    程序输出是

    1 2 3
    

    如果不允许交换字符串,则可以使用 std::reference_wrapper 类型的对象。这是一个演示程序。

    #include <iostream>
    #include <string>
    #include <utility>
    #include <functional>
    
    int main() 
    {
        std::string a( "2" ), b( "1" ), c( "3" );
        auto ra = std::cref( a ), rb = std::cref( b ), rc = std::cref( c );
            
        if ( rb.get() < ra.get() ) std::swap( ra, rb );
        if ( rc.get() < rb.get() ) std::swap( rb, rc );
        if ( rb.get() < ra.get() ) std::swap( ra, rb );
        
        std::cout << ra.get() << ' ' << rb.get() << ' ' << rc.get() << '\n';
    
        return 0;
    }
    

    程序输出同上图。

    1 2 3
    

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 2011-06-13
      • 2018-03-10
      • 1970-01-01
      • 2016-07-25
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多