今日头条2017年实习生在线笔试题1

有 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值