今天面试,面试官给了一道题,让把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;
}