有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
利用权重来实现
例如
ABC 各位上的权重为A:100; B:10; C:1
BCA 各位上的权重为B:100; C:10; A:1
字母A的总权重100+1 = 101;字母B的总权重10+100=110;字母C的总权重为1+10=11
<?php
$arr = ['ABC','BCA'];
echo maxSumStr($arr);
function maxSumStr($arr){
$max = 9;
//权重
$weight = array('A'=>0,'B'=>0,'C'=>0,'D'=>0,'E'=>0,'F'=>0,'G'=>0,'H'=>0,'I'=>0,'J'=>0);
foreach ($arr as $key => $str) {
$arr[$key] = str_split($str);
}
for ($i=0;$i<count($arr);$i++){
for($j=count($arr[$i])-1;$j>=0;$j--){
$p = 1;//倍率初始值
$x = count($arr[$i])-1 - $j;//处于第几位
while($x>0){
$p*=10;
--$x;
}
$weight[$arr[$i][$j]] += $p;
}
}
arsort($weight);
foreach ($weight as $k => $v) {
$weight[$k] = $max--;
}
//计算总和
$sum = 0;
foreach ($arr as $key => $str) {
$p = 1;
$num = 0;
for($i=count($str)-1;$i>=0;$i--){
$num += $weight[$str[$i]]*$p;
$p*=10;
}
$sum += $num;
}
return $sum;
}