如何更优雅编码、更优算法 | 阶梯式电费算法 | 非常感谢、请指教~
如何更优雅编码、更优算法 | 阶梯式电费算法 | 非常感谢、请指教~
电费的阶梯式算法
?笑:-D~ 倒序进行中,如何更加优雅、使用更少的代码,甚至更优的算法呢?
常常会见到这种场景:
举个栗子,深圳为了推进市民节约用电推出了这样一个用电收费政策,电量使用阶梯式递增的收费计算方式,简单而言、用电越多平均的每度电越贵。(假设用户的每电量为整数,小于1度电则应缴费为0元)
计算电费的剃度表如下所示:
耗电范围(°) | 电费计算(1元/°) |
---|---|
1<=x <=10 |
1 |
11<=x <=20 |
1.2 |
21<=x <=50 |
1.4 |
51<=x <=100 |
1.8 |
101<=x <=300 |
2.4 |
301<=x |
5 |
- 一般的算法如下。感谢更优的代码方案~
/**
* 根据用电的度数计算电费
* @param int $number 用电度数
* @return float 电费
*/
function calculate(int $number): float
{
if ($number <= 0) {
return 0;
}
switch ($number) {
case 1 <= $number && $number <= 10:
return $number * 1;
break;
case 11 <= $number && $number <= 20:
return ($number - 10) * 1.2 + calculate(10);
break;
case 21 <= $number && $number <= 50:
return ($number - 20) * 1.4 + calculate(20);
break;
case 51 <= $number && $number <= 100:
return ($number - 50) * 1.8 + calculate(50);
break;
case 101 <= $number && $number <= 300:
return ($number - 100) * 2.2 + calculate(100);
break;
default:
return ($number - 300) * 5 + calculate(300);
break;
}
}
不定维数组的排序(键名)
如何优雅高效地将一个不定维数组按照键名排序。
// 如下为不定维数组变量
$data = [
'amount' => 100,
'quota' => 100000000,
'applicant' => [
'name' => 'alicfeng',
'sex' => 'M',
'age' => 21,
'certificate' => [
'number' => '441701995********',
'start_date' => '20080808',
'end_date' => '20280808'
]
],
'family' => [
'number' => 5,
'feel' => 'nice'
]
];
本作品采用《CC 协议》,转载必须注明作者和本文链接
价值源于技术,贡献源于分享 | 笔记分享归档
No matter where I am, I will reply you immediately when I see the email.
My Email: echo "YUBzYW1lZ28uY29tCg==" | base64 -d
个人比较喜欢分享,若有不对的地方非常感谢指出
相互学习、共同进步~
没有看明白,传300进去,不是一直死循环?
@半人间
300的话、在此
code
往上递归,不会造成死循环一般这种区间的计算我都会使用
foreach
, 习惯问题, 我也不知道啥更优解
, 下面是我的代码@ruke 很不错 :+1:,既简洁又高效~学习了、非常感谢!
感觉遇到了同一份笔试题。。。我switch中后边加的是上一节的最大值 :joy:
@Mr_WhiteDT 笔试竟然考这道题了O(∩∩)O哈哈~。 无论是使用
if
还是switch
会造成时间复杂度很大,同时也导致代码灵活性不强。利用PHP_INT_MAX
不用PHP_INT_MAX