All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!

IF语句的替代方案(找出数组中最小值)

上一篇 / 下一篇  2010-12-01 23:24:47 / 个人分类:C/C++

看到淘宝的QA团队上次搞的一个题目,不使用IF语句,从五小强中找出战斗力最小的人, 示例:
输入    70 65 20 80 50
输出    20
题目详情见:http://bangpai.taobao.com/group/thread/186587-19105050.htm
他们也总结到,同学们主要给出了如下三种方法:
1.用sort、三元表达式、switch、while、treeset等手段,替代if的方法
2.不使用if来比较两个数的大小,数学方法和位运算也属于其中一种,位运算是将两数之差的符号位向右位移至最低位,从而判断两数的大小
3.数据库sql实现。(尽管很简单的SQL,但发现这个挺有创意的哦)
先说一下,SQL实现吧(Oracle)。将这几个数字insert到一张表temp表的num自动,然后用如下的SQL语句select出来即可。
select min(t.num) from temp t;
select b.num from (select a.id, rownum rn from (select t.id from temp t order_by t.id) a) b where b.rn=1;
晚上,对其用C语言实现了三种不用if的方案,贴代码吧,里面也有写注释:
#include    <stdio.h>

#define    N 5

void printArray(int arr[], int len);
void printMin(int min, char* method_name);
void findMin_1(int arr[], int* pMin);
void findMin_2(int arr[], int* pMin);
void findMin_3(int arr[], int* pMin);


int main(int argc, char *argv[])
{
    int array[N]={70,65,20,80,50};
    int min;
    printArray(array,N);
    findMin_1(array,&min);
    printMin(min,"findMin_1");
    findMin_2(array,&min);
    printMin(min,"findMin_2");
    findMin_3(array,&min);
    printMin(min,"findMin_3");
}

/*打印原数列*/
void printArray(int arr[], int len)
{
    int i;   
    printf("the array is:\n");
    for( i=0 ; i<len ; i++ )
    {  
        printf("%d\t",arr[i]);
    }
    printf("\n");
}

/*打印得到的最小数字,也打印出哪种方法计算的*/
void printMin(int min, char* method_name)
{
    printf("%s---the Minimum item is:\n%d\n",method_name,min);
}

/*用三目运算符来代替if*/
void findMin_1(int arr[], int* pMin)
{
    int i=0;
    *pMin=arr[0];
    for( i=1 ; i<N ; i++ )
    {  
        *pMin=(*pMin-arr[i]>0)?arr[i]:*pMin;
    } 
}

/*用switch来代替if,并且用了位运算来实现比较两个的大小(对二者之差的最高位为0或1的判断)*/
void findMin_2(int arr[], int* pMin)
{
    int i=0;
    *pMin=arr[0];
    for( i=1 ; i<N ; i++ )
    {
        switch ( (*pMin-arr[i])>>(8*sizeof(int)-1) )
        {
            case 0 :
                *pMin=arr[i];
                break;
            case 1 :
                break;
            default :
                break;
        }
    }
   
}

/*用while+break语句来替代了if*/
void findMin_3(int arr[], int* pMin)
{
    int i=0;
    *pMin=arr[0];
    for( i=1 ; i<N ; i++ )
    {
        while( *pMin - arr[i] > 0 )
        {
            *pMin=arr[i];
            break;
        }
    }
}

输出结果为:
the array is:
70      65      20      80      50
findMin_1---the Minimum item is:
20
findMin_2---the Minimum item is:
20
findMin_3---the Minimum item is:
20

然后,在淘宝QA那里还有用java的sort排序后得到最小值的。尽管比较简单,代码如下:
package com.alibaba.practice;

import java.util.Arrays;

public class FindMin {
    public static void main(String[] args) {
        int[] array = { 70, 65, 20, 80, 50 };
        System.out.println("Array is :");
        for (int i : array) {
            System.out.printf(i+"\t");
        }
        Arrays.sort(array); // 数组排序
        System.out.print("\nUsing Java sort().--The Minimum item is:" + array[array.length - 5]);
    }
}


TAG: c语言 C语言 算法 if

 

评分:0

我来说两句

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2024-05-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 957172
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar