Java solution to Codility BinaryGap problem (Lesson 1 – Iterations) which scored 100%. The problem is to find the longest sequence of zeros in a binary representation of an integer. The main strategy is:
- convert the integer to a binary string
- go through each character one by one and save the index of each 1 to a list
- go through the list of 1 indices and look for the largest difference in indices
[cc lang="java" escaped="true"] package com.codility.lesson01.iterations; import java.util.ArrayList; import java.util.List; public class BinaryGap { public int solution(int N) { String binaryString = Integer.toBinaryString(N); int longestBinaryGap = 0; List onesList = new ArrayList(); for(int i=0; i<binaryString.length(); i++) { if(binaryString.charAt(i) == '0') continue; onesList.add(i); } for(int i=0; i<onesList.size() - 1; i++) { //subtract 1 so that don't count 1's next to each other as having any gap int indicesDiff = onesList.get(i+1) - onesList.get(i) - 1; longestBinaryGap = Math.max(longestBinaryGap, indicesDiff); } return longestBinaryGap; } } [/cc]
TestNG test cases for this problem which all passed:
[cc lang="java" escaped="true"] package test.com.codility.lesson01.iterations; import org.testng.Assert; import org.testng.annotations.*; import com.codility.lesson01.iterations.BinaryGap; public class BinaryGapTests { private BinaryGap solution; @BeforeTest public void setUp() { solution = new BinaryGap(); } @DataProvider(name = "test1") public Object [][] createData1() { return new Object [][] { new Object [] { 0, 0 }, new Object [] { 9, 2 }, new Object [] { 15, 0 }, new Object [] { 32, 0 }, new Object [] { 529, 4 }, new Object [] { 1041, 5 }, new Object [] { 65536, 0 }, new Object [] { 65537, 15 }, new Object [] { 100000, 4 }, new Object [] { 2147483, 5 }, new Object [] { 2147483637, 1 }, //max - 10 new Object [] { 2147483646, 0 }, //max - 1 new Object [] { 2147483647, 0 } //max }; } @Test(dataProvider = "test1") public void verifySolution(int pInput, int expectedBinaryGap) { Assert.assertEquals(solution.solution(pInput), expectedBinaryGap); } } [/cc]