Google Interview Question
Software Engineer / DevelopersIn Haskell
inc :: [Int] -> [Int]
inc xs = reverse $ fromNum (toNum xs + 1) where
toNum = foldl1 (\x y -> 10*x + y)
fromNum = unfoldr gen
gen x = if x == 0 then Nothing else Just (x `mod` 10, x `div` 10)
in Java:
public int AddToNumber( int[] arr)
{
int number=0;
int prod=1;
for( int i=arr.length-1;i>=0;i--)
{
number=number+arr[i]*prod;
prod=prod*10;
}
number++;
return number;
}
public class NumberArrayDemo
{
int[] number ={ 6,9, 9, 9 };
public void addOne()
{
addOne(number.length-1);
return;
}
public void addOne(int loc)
{
if(number[loc]++ > 9)
{
if(loc==0)
{
//increase the array by length one and shift contents to index+1 and at 0th position of array add 1
return;
}
else
{
number[loc]=0;
addOne(loc-1);
}
}
return;
}
public static void main(String...s)
{
NumberArrayDemo demo=new NumberArrayDemo();
demo.addOne();
}
}
<pre lang="" line="1" title="CodeMonkey12377" class="run-this">/* The class name doesn't have to be Main, as long as the class is not public. */
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in));
String s;
while (!(s=r.readLine()).startsWith("42")) System.out.println(s);
}
}
</pre><pre title="CodeMonkey12377" input="yes">
</pre>
Need to take in account the case where all numbers are 9, in which case we need to grow the array. my c++ solution:
void CareerCup::Add1ToArray(int *&numArray, int size)
{
numArray[size-1]+=1;
for(int i =size-1; i>0; i--)
{
if(numArray[i] > 9)
{
numArray[i] =0;
numArray[i-1] +=1;
}
else
{
return;
}
}
if(numArray[0] > 9)
{
int *newNum = new int[size+1];
for(int i=0; i<size; i++)
{
newNum[i+1] = numArray[i];
}
newNum[1] = 0;
newNum[0] = 1;
delete[] numArray;
numArray=newNum;
}
}
{{
#include <iostream>
int main() {
int arr[] = {4,5,9,9};
int i = 0;
int size = sizeof(arr)/sizeof(arr[0]);
int tempSum = 0;
int carryForward = 1;
for( i = (size - 1) ; i >=0 ; i--) {
tempSum = arr[i] + carryForward;
carryForward = 0;
if(tempSum >= 10) {
carryForward = 1;
}
arr[i] = tempSum % 10;
}
for(i = 0 ; i < size ; i++) {
std::cout<<arr[i]<<" ";
}
getchar();
}
}}
<pre lang="" line="1" title="CodeMonkey86789" class="run-this">/** Assuming array passed in as array of integers and addition is non-negative.
* Returns a new array.
*/
def add(arr: Array[Int], x: Int): Array[Int] = {
if(arr == null || arr.length <= 0) return arr
else {
var carry = x
var i = arr.length - 1
var narray = Array.ofDim[Int](arr.length)
System.arraycopy(arr, 0, narray, 0, arr.length)
while(i >= 0 && carry > 0) {
val t = narray(i) + carry
narray(i) = t % 10
carry = t / 10
i = i - 1
}
if(i < 0) {
// expand array
val newArray = Array.ofDim[Int](arr.length + 1)
newArray(0) = carry
System.arraycopy(narray, 0, newArray, 1, newArray.length - 1)
return newArray
} else {
return narray
}
}
</pre>
<pre lang="" line="1" title="CodeMonkey3044" class="run-this">set data "9 9 9 9"
set len [ llength $data ]
set len [ expr { $len - 1 } ]
set temp1 [ lindex $data $len ]
set temp1 [ expr { $temp1 + 1 } ]
set remainder [ expr { $temp1 / 10 } ]
set temp2 [ expr { $temp1 % 10 } ]
set data [ lreplace $data $len $len $temp2 ]
set i [ expr { $len - 1 } ]
while { $i > 0 } {
if { $remainder == 0 } {
break
}
set temp1 [ lindex $data $i ]
set temp1 [ expr { $temp1 + $remainder } ]
set remainder [ expr { $temp1 / 10 } ]
set temp2 [ expr { $temp1 % 10 } ]
set data [ lreplace $data $i $i $temp2 ]
incr i -1
}
if { $remainder != 0 } {
set temp1 [ lindex $data 0 ]
set temp1 [ expr { $temp1 + $remainder } ]
set data [ lreplace $data 0 0 $temp1 ]
}
puts $data
puts "[ join $data "" ]"</pre><pre title="CodeMonkey3044" input="yes">
</pre>
Do +'1' - '0'
- dss.chandra April 08, 2011