-
背景
近期面試遇到一家公司的編程題,覺得挺有參考價值
此處使用PHP
語言,進行編碼測試,
編碼之前要進行思路分析,避免無頭蒼蠅,走一步看一步
最后,希望后期面試順利!歡迎指摘 . -
題目:文章來源:http://www.zghlxwxcb.cn/news/detail-512427.html
編程題:
有?堆糖果,其數(shù)量為n,
現(xiàn)將糖果分成不同數(shù)量的堆數(shù)(每堆數(shù)量均為整數(shù),最少為1),
請算出糖果堆對應(yīng)數(shù)量的最?乘積是多少,并給出對應(yīng)的分配?案;
舉例:糖果數(shù)量為8,可以得到的乘積最?為18,對應(yīng)的分配?案為【2,3,3】;
- 思路分析:
初始測試數(shù)據(jù)比較小,可以在草稿紙上窮舉分配方案,尋找規(guī)律,發(fā)現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-512427.html
- 當(dāng)數(shù)量小于5時,最大的乘積就是本身,無需分配
- 其次注意到分配后的數(shù)目如果是1則毫無意義,
- 同時窮舉發(fā)現(xiàn),越靠近數(shù)字3,乘積越大,得到的分配方案最符合要求
- 所以算法重點處理數(shù)量大于5的情況
首先獲取除3的整數(shù)部分$count
, 和取模數(shù)字$mod
根據(jù)變量$count
,判斷乘積,for
循環(huán)處理,并得到每個分配數(shù)字
分析$mod
變量的影響,使得分配數(shù)盡可能靠近數(shù)字3
最后,簡單測試數(shù)量n
,驗證分配方案是否符合實際要求 .
- 編碼如下:
**
* 有?堆糖果,其數(shù)量為n,現(xiàn)將糖果分成不同數(shù)量的堆數(shù)
* @param int $z_number 糖果數(shù)量
* @return string 檢測結(jié)果
*/
public function zingFunc($z_number = 0){
//檢驗數(shù)據(jù)規(guī)范性
$res_msg = '分配數(shù)字為:'.$z_number;
//最大乘積
$max_result = 1;
//方案分配
$option_msg = '';
if (is_int($z_number)&& $z_number > 0){
if ($z_number < 5){
$max_result = $z_number;
$option_msg = $z_number;
}else{
//整數(shù)大于5,詳細分析
//取商的整數(shù)
$count = intval($z_number/3);
//除3取模
$mod = $z_number%3;
$arr_option = [];
if ($mod == 0){
//此時正好是統(tǒng)一分配
for ($i=0;$i<$count;$i++){
$max_result*=3;
$arr_option[] = 3;
}
}elseif ($mod == 1){
//對其中的一個分配數(shù)加1
for ($i=0;$i<$count-1;$i++){
$max_result*=3;
$arr_option[] = 3;
}
$max_result *=4;
$arr_option[] = 4;
}else{
//余數(shù)為2的時候,可以對前面取兩堆,分別加1
for ($i=0;$i<$count-2;$i++){
$max_result*=3;
$arr_option[] = 3;
}
$max_result *=4;
$max_result *=4;
$arr_option[] = 4;
$arr_option[] = 4;
}
$option_msg = implode(',',$arr_option);
}
$res_msg .= ',最大乘積為:'.$max_result.',方案分配為:【'.$option_msg.'】';
}else{
$res_msg .= ',數(shù)據(jù)輸入不是正整數(shù)';
}
//echo('<br>'.$res_msg);
return $res_msg;
}
- 測試截圖:
到了這里,關(guān)于編程題分享:有?堆糖果,其數(shù)量為n,現(xiàn)將糖果分成不同數(shù)量的堆數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!