seri::diary

日常

またコーディングテストを解いてみた

暇つぶしにここのリンクにあった
コーディング問題を解いてみた

問題:
Given a number, e.g., 2789, as an array [2,7,8,9]. Write a method that returns the array incremented by one: i.e. [2,7,9,0].

<?php
	
	print_r( arrayCalc( array(2,5,2,5) ) );
	
	
	function arrayCalc($valueArray){
	
		if( !is_array($valueArray) || (count($valueArray) == 0) ){
			return false;
		}
		
		$sizeOfValue = count($valueArray);
		$orgValue = 0;
		
		for($i=0;$i <= ($sizeOfValue - 1); $i++){
			$orgValue += $valueArray[$i] * pow(10 , ( $sizeOfValue - 1 - $i ) );
		}


		$orgValue += 1;

		$add1ValueArray = array();
		
		//加算結果の桁上がりを考慮して再度桁数を確認しておく
		$countOfValue = strlen( (string)$orgValue );

		while($countOfValue > 0){
			$add1ValueArray[ ($countOfValue - 1) ] = $orgValue % 10;
			$orgValue = floor($orgValue / 10);
			$countOfValue = $countOfValue - 1;	
		}
		
		return 	$add1ValueArray;
	}
?>

30分もかけずにさらっと書いたので
ロジック重視で例外処理は殆ど考えていない。

手順は単純だが配列の添字指定で多少手間取った。
こういうのを頭の中でサラっと書けないとMSやGoogleTwitterには入れないんだろうなぁ・・


とりあえず処理の流れとしては

1.配列の各要素 × 10の(要素数合計 -1 - 配列添字)乗 した値を合算して元の数値を復元
2.復元した数値に+1
3.復元した数値+1の1の位から順に配列に突っ込んで終了

頭から取り出してケツから突っ込む、みたいな流れ。


ただ、何度かテストして気づいたが、32bit環境で動作させると14桁以上ぐらいになると10で割った値の余りの数値が負の数になったりおかしい数字が出るようになる。

1000000000000 % 10とかでこの現象が起きているので、単純な丸め誤差の問題とかではなさそうな気がする。
これが何に起因する問題なのか今は分からないが、PHPにおける解決策の実装が分かったら入れてみようと思う。