之前很多次刷力扣题看题解,说有些解法会遇到内存溢出问题,不知道是幸运还是不幸,我从没遇见过,直到~~
力扣66题:加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
我的解法:
直接把[1,2,9]收集成129,再加一后130,再分割到数组里,很直观,复杂度也能接受。
function plusOne($digits) {
$count = count($digits);
$nums = '';
for($i=0;$i<$count;$i++){
$nums .= $digits[$i];
}
$nums++;
$digits = [];
while($nums>=1){
$val = $nums%10;
array_unshift($digits,$val);
$nums = $nums/10;
}
return $digits;
}
但是测试遇到[4,5,7,8,3,5,6,6,5,9,0,2,7,8,3,3,9,4,2,1,5,4,5,6,2,1,8,7,9,0,4,9,5,7,7,9,2,1,8,3,0]这么长的数组,我的int终于溢出了
目瞪口呆+恍然大悟之后,能想到的方法就是自己做进位了
function plusOne($digits) {
$count = count($digits);
$nums = '';
$flag = 0;
for($i=$count-1;$i>=0;$i--){
if($i == $count-1){
$digits[$i]++ ;
}
if($flag == 1){
$digits[$i]++;
}
if($digits[$i] == 10){
$flag = 1;
$digits[$i] = 0;
}else{
$flag = 0;
}
}
if($flag == 1){
array_unshift($digits,1);
}
return $digits;
}
之前有二进制求和我也是用的自己写进位
67二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
function addBinary($a, $b) {
if($a == 0 && $b == 0){
return '0';
}
$i= $j = 1;
$flag = 0;
$nums = '';
while($i<=strlen($a) || $j<=strlen($b)){
$sub = 0;
if($i<=strlen($a)){
$sub += substr($a,-$i,1);
}
if($j<=strlen($b)){
$sub += substr($b,-$j,1);
}
$adds = $sub + $flag;
if($adds>=2){
$flag = 1;
$adds = $adds-2;
}else{
$flag = 0;
}
$nums = $adds.$nums;
$i++;
$j++;
}
if($flag == 1){
$nums = '1'.$nums;
}
return $nums;
}
ps:
官方运行时间、内存占用情况很多时候和运行时选取的这批测试用例关系很大,千万不要以为自己写的例子打败了百分之几十几十就真的很厉害(不信多提交几次,结果通常是有差异的),一定要规规矩矩算时间空间复杂度,综合分析算法的优劣。
当然像我这样的菜鸡,逼急了暴力破解也是解。