【问题标题】:Simple logic problem: Finding largest and smallest number among 3 numbers简单的逻辑问题:在 3 个数字中找到最大和最小的数字
【发布时间】:2011-08-13 01:55:48
【问题描述】:

我正在创建一个伪代码来确定 3 个数字中的最小和最大数字:

我的代码如下:

If (x >= y)  
   largest = x
   Smallest = y
Else 
    largest = y
    Smallest =x

If (z >= largest)
    Largest = z
If (z <= smallest)
    Smallest = z

你认为这是正确的吗?还是有更好的方法来解决这个问题?

【问题讨论】:

  • 如果没有两个数字相等,它应该可以工作。
  • 但是如果两个数字相等怎么办?为什么它不起作用?
  • 3,3,3。如果逻辑说所有数字都相等,那可能会很好。虽然很明显,当最大和最小相等时,所有数字都相等。

标签: language-agnostic logic


【解决方案1】:

假设您有任意数字x, y, z

伪代码:

largest = x
smallest = x

if (y > largest)  then largest = y
if (z > largest)  then largest = z

if (y < smallest) then smallest = y
if (z < smallest) then smallest = z

如果您只使用变量、赋值、if-else 和比较,这是解决问题的一种方法。


如果你定义了数组和排序操作,你可以使用这个:

array = [x, y, z]
arrays.sort()
largest  = array[2]
smallest = array[0]

如果您有一个将数字数组作为参数的maxmin 函数,则可以使用:

array = [x, y, z]
largest  = max(array)
smallest = min(array)

如果你也有使用集合的位置分配,你可以使用这个:

array = [x, y, z]
(largest, smallest) = (max(array), min(array))

如果你有一个数据结构可以在插入元素时对其内容进行排序,你可以使用这个:

array.insert([x, y, z])
smallest = array[0]
largest = array[2]

【讨论】:

  • 在学术方面:您的算法具有 O(n log n) 复杂度。可以用 O(n)...
  • @Lukas:我想说无论哪种方式都是 O(1) :)
  • @abeln:n 是一般解决方案的数组中元素的数量(如果有超过 3 个元素。你看,相当学术...... ;-))跨度>
  • @Lukas:我只看到 3 个数字,没有“一般”解决方案(如果有 n 个数字,array[2] 不会给你最大值)。不过,我明白你的意思。
  • @Lukas:我没有指定 sort 使用什么算法 ;-)
【解决方案2】:
#include <stdio.h>
#include <algorithm>
using namespace std;

int main ( int argc, char **argv ) {
    int a = 1;
    int b = 2;
    int c = 3;

    printf ( "MAX = %d\n", max(a,max(b,c)));
    printf ( "MIN = %d\n", min(a,min(b,c)));

    return 0;
}

【讨论】:

    【解决方案3】:

    这样的东西会更通用(在 Java 中):

    // All available values.
    int[] values = new int[] { 1, 2, 3 };
    
    // Initialise smallest and largest to the extremes
    int smallest = Integer.MAX_VALUE;
    int largest = Integer.MIN_VALUE;
    
    // Compare every value with the previously discovered
    // smallest and largest value
    for (int value : values) {
    
      // If the current value is smaller/larger than the previous
      // smallest/largest value, update the reference
      if (value < smallest) smallest = value;
      if (value > largest) largest = value;
    }
    
    // Here smallest and largest will either hold the initial values
    // or the smallest and largest value in the values array
    

    【讨论】:

      【解决方案4】:
      if (x < y) {
        minimum = min(x,z)
        maximum = max(y,z)
      } else {
        minimum = min(y,z)
        maximum = max(x,z)
      }
      

      【讨论】:

        【解决方案5】:

        用 a、b 和 c 表示数字,假设没有两个数字相等。

        读取三个数字

        • 如果 a 小于 b,则如果 a 小于 c 打印 a,否则打印 c
        • 如果 b 小于 a,则如果 b 小于 c 打印 b,否则打印 c

        【讨论】:

          猜你喜欢
          • 2021-11-03
          • 1970-01-01
          • 2011-10-31
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 2013-11-10
          相关资源
          最近更新 更多