首页 > if转switch结构

if转switch结构

今天面试,面试官给了一道题,让把if结构转成switch

if(s>0&&s<=10)
 {
     if(s>=3&&s<=6)
         x=2;
     else if(s>1||s<8)
         x=3;
     else
         x=1;
 }
 else
     x=0;

我的答案如下:

 k=(s>0&&s<=10)?((s>=3&&s<=6)? 2:((s>1||s<8)?3:1)):0;
 switch(k)
 {
     case 0:x=0;break;
     case 1:x=1;break;
     case 2:x=2;break;
     case 3:x=3;break;
 }

面试官看了之后说你这个不用switch就已经做出来了呀,还用switch干啥呢,我想了想也是呀,通过三目运算就把结果求出来了,把k换成x就搞定了。
我自己想了想,毫无头绪,区间划分那么乱,不能对数s整除,然后switch case。
直接贴代码,直接贴代码,直接贴代码!
if转成switch后,不能含有if else,真想去问问面试官,这该如何实现.

思路是嵌套switch,之前一直没注意可以嵌套switch语句.

switch (s > 0 && s <= 10)
    {
            
        case 1:
        switch (s >= 3 && s <= 6)
        {
            case 1:
                x = 2;
                break;
            default:
                x = 3;
                break;
        }
            break;
        default:
            x = 0;
            break;
    }

var s,x;
switch(s>0&&s<=10){
    case true :
        switch(s){
            case 2:
            case 7:
                x=3;
                break;
            case 3:
            case 4:
            case 5:
            case 6:
                x=2;
                break;
            default:
                x=1;
                break;
        }
        break;
    default :
        x=0;
        break;
}

楼主会不会记错题了...
我感觉是else if(s>1 && s<8),就按这个条件搞了.思路参考某楼的栈溢出链接,代码和测试如下(js)

function fnSwitch (s) {
  var x;
  switch(true){
    case(s <= 0):x=0;break;
    case(s <= 1):x=1;break;
    case(s <  3):x=3;break;
    case(s <= 6):x=2;break;
    case(s <  8):x=3;break;
    case(s <= 10):x=1;break;
    default:x=0;
  }
  return x;
}

function fnIf (s){
  var x;
  if(s>0&&s<=10)
   {
       if(s>=3&&s<=6)
           x=2;
       else if(s>1&&s<8)
           x=3;
       else
           x=1;
   }
   else
       x=0;
    return x;
}

(() => {
  for(var i = -1; i <= 11; i += 0.01){
    var a = fnSwitch(i);
    var b = fnIf(i);
    if(a !== b){
      console.log('fail! ' + 'current x is ' + i, a, b);
      break;
    }
  }
  console.log('success!', i);
})()

首先,请允许我把题主的代码块包在一个函数里(方便测试):

var org = function(s) {
  var x;
  if (s > 0 && s <= 10) {
    if (s >= 3 && s <= 6)
      x = 2;
    else if (s > 1 || s < 8)
      x = 3;
    else
      x = 1;
  }
  else
    x = 0;
  return x;
};

然后大家有没有注意到,我可以把代码简化成这样:

var org = function(s) {
  var x;
  if (s > 0 && s <= 10) {
    if (s >= 3 && s <= 6)
      x = 2;
    else
      x = 3;
  }
  else
    x = 0;
  return x;
};

s > 1 || s < 8任何情况下都只能是true
那么,换成switch的函数:

var test = function(s) {
  var x;
  switch (s > 0 && s <= 10) {
    case true:
      switch (s >= 3 && s <= 6) {
        case true:
          x = 2;
          break;
        default:
          x = 3;
          break;
      }
      break;
    default:
      x = 0;
      break;
  }
  return x;
}

其实都不用测试的,不过为了严谨,我还是测试过了,没问题。
大家也可以将这两个函数复制出来测试一下 :P

希望能够帮助到你~ XD


经@mcfog指点,又优化了一下,这个答案会比我之前的那个更合适:

var best = function(s) {
  var x;
  switch (true) {
    case !(s > 0 && s <= 10):
      x = 0;
      break;
    case s >= 3 && s <= 6:
      x = 2;
      break;
    default:
      x = 3;
      break;
  }
  return x;
}

没想到答案..就觉得题目挺有意思
画出来的图是这样的


if (s > 7 && s < 8) {
    s = Math.floor(s);
} else {
    s = Math.ceil(s);
}
switch (s) {
    case 1:
        x = 1;
        break;
    case 2:
        x =3;
        break;
    case 3:
    case 4:
    case 5:
    case 6:
        x = 2;
        break;
    case 7:
    case 8:
        x = 1;
        break;
    case 9:
    case 10:
        x = 3;
        break;
    
    default:
        x = 0;
        break;
}

强烈怀疑else if(s>1||s<8)应该是else if(s>1&&s<8),否则这题有点弱智。

按照这种思路,根据s值的不同,x的值有如下几种情况:

(0,1]、[8,10]时x=1
[3,6]时x=2
(1,3)、(6,8) 时x=3
其他情况x=0

于是可以写出以下代码:

int t1 = ceil(s); // 向上取整,(0,10]的取整结果为[1, 10]的自然数
int t2 = floor(s); // 向下取整
switch (t1) {
    case 1: case 8: case 9: case 10:
        switch (t2) {
            case 1: case 8: case 9: case 10:
                x = 1;
                break;
            case 7: // 这里用default也行
                x = 3;
                break;
        }
        break;
    case 3: case 4: case 5: case 6:
        switch (t2) {
            case 3: case 4: case 5: case 6:
                x = 2;
                break;
            case 2: // 也可以用default
                x = 3;
                break;
        }
        break;
    case 2:
    case 7:
        x = 3;
        break;
    default:
        x = 0;
        break;
}

主要思路就是通过向上和向下取整,然后判断它们的交集来确定s的范围。


switch( s )
{

default:
    x = 0;
    break;

case 3:
case 4:
case 5:
case 6:
    x = 2;
    break;

case 2:
case 7:
    x = 3;
    break;

case 1:
case 8:
case 9:
case 10:
    x = 1;
    break;        

}


var x;
function changeX(s){
    switch(true) {
      case !(s > 0 && s <= 10):
        x = 0
        break
        case (s >= 3 && s <= 6):
           x = 2
           break
      default:
          x = 3
          break
    }
}
changeX(1);

建议楼主话个横轴坐标图,0到10分段case,其他的default咯,我就不给答案了,这个思路你应该知道怎么过了


@囧囧有神的兔纸 这个错是没错,就不知道是不是面试官想要的答案。 个人感觉有点跑偏~


可以只用一层switch完成的

只说思路:

if(X) {
  A
} elseif(Y) {
  B
} else {
  C
}

等价于

switch(true) {
  case X:
    A;
    break;
  case Y:
    B;
    break;
  default:
    C;
    break;
}

再来一点思路

题目的嵌套if可以先转换成单层的if,然后单层的if可以按照上述方式变成单层的switch(true),不需要case穿透


通篇看下来,这样的if条件转swith,看着代码,不觉的累并且可读性并没有提高反而费劲了吗


if用于连续区间,switch用于离散的点,多个离散的点模拟一个区间,再把参数转化为离散点集中的一个


    switch (s) {
        case !(s > 0 && s <= 10):
            x = 0;
            break;
        case (s >= 3 && s <= 6):
            x = 2;
            break;
        case (s > 1 || s < 8):
            x = 3;
            break;
        default:
            x = 1;
    }

http://stackoverflow.com/questions/6665997/switch-statement-for-greater-than-less-than


这个可以做,你回去看看,break是怎么用,以及有break,和没有break的用法,就知道了!我用手机回答的就不写代码了!


没有优先级的时候,if才能转化成switch

switch(s)
{
    case 1:
        x=1;
        break;
    case 2:
        x=3;
        break;
    case 3:
    case 4:
    case 5:
    case 6:
        x=2;
        break;
    case 7:
    case 8:
        x=3;
        break;
    case 9:
    case 10:
        x=1;
        break;
    default:
        x=0;
        break;
}

你要加break的还是不加的?

x = 0;

switch(s) 
{
    case 2: case 7:
        x += 1;
    case 3: case 4:
    case 5: case 6:
        x += 1;
    case 1: case 8:
    case 9: case 10:
        x += 1;
}

纯吐槽: 既然面试官说“还用switch干啥”,那么你可以反问面试官呀,“这是复合的条件判断,而且还是连续的case,即使可以方便地转成几个离散的case,也看不出这样做对可读性和效率上有什么特别的意义。那还用switch干啥呢?”
讨厌这种面试题。


s = Math.ceil(s);
if (s > 0 && s <= 10) {

 switch(s) {
    case 3:
    case 4:
    case 5:
    case 6:
        x = 2;
        break;
    case 2:
    case 7:
        x = 3;
        break;
    default:
        x = 1;
        break;
 }

} else {

 x=0;

}

【热门文章】
【热门文章】