package exercises;
public class MergeSort {
private static void merge(int[] values, int leftStart, int midPoint,
int rightEnd) {
int intervalSize = rightEnd - leftStart;
int[] mergeSpace = new int[intervalSize];
int nowMerging = 0;
int pointLeft = leftStart;
int pointRight = midPoint;
do {
if (values[pointLeft] <= values[pointRight]) {
mergeSpace[nowMerging] = values[pointLeft];
pointLeft++;
} else {
mergeSpace[nowMerging] = values[pointRight];
pointRight++;
}
nowMerging++;
} while (pointLeft < midPoint && pointRight < rightEnd);
int fillFromPoint = pointLeft < midPoint ? pointLeft : pointRight;
System.arraycopy(values, fillFromPoint, mergeSpace, nowMerging,
intervalSize - nowMerging);
System.arraycopy(mergeSpace, 0, values, leftStart, intervalSize);
}
public static void mergeSort(int[] values) {
mergeSort(values, 0, values.length);
}
private static void mergeSort(int[] values, int start, int end) {
int intervalSize = end - start;
if (intervalSize < 2) {
return;
}
boolean isIntervalSizeEven = intervalSize % 2 == 0;
int splittingAdjustment = isIntervalSizeEven ? 0 : 1;
int halfSize = intervalSize / 2;
int leftStart = start;
int rightEnd = end;
int midPoint = start + halfSize + splittingAdjustment;
mergeSort(values, leftStart, midPoint);
mergeSort(values, midPoint, rightEnd);
merge(values, leftStart, midPoint, rightEnd);
}
}
Wednesday, August 22, 2012
Java mergesort exercise
Sunday, August 19, 2012
Show that a × b can be less than min(a, b)
Show that a × b can be less than min(a, b)
(a, b) = (-2, 3)
-2 (3) < min(-2, 3)
-6 < -2
Show that a + b can be less than min(a, b)
Show that a + b can be less than min(a, b).
(a, b) = (-1, -1)
-1 + (-1) < min(-1, -1)
2 < -1
Friday, August 17, 2012
Write a method to decide if two strings are anagrams or not
Write a method to decide if two strings are anagrams or not.
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
* Write a method to decide if two strings are anagrams or not.
*/
public class StringAnagrams extends TestCase {
public static boolean areAnagrams(String s1, String s2) {
if (s1 == null) {
throw new NullPointerException("Argument 's1' can not be null.");
}
if (s2 == null) {
throw new NullPointerException("Argument 's2' can not be null.");
}
Map<Character, Integer> charMap = new HashMap<Character, Integer>();
stringIntoCharMapWithValues(s1, charMap, 1);
stringIntoCharMapWithValues(s2, charMap, -1);
return isMapOfNumbersAllZeroes(charMap);
}
public static <K, V extends Number> boolean isMapOfNumbersAllZeroes(
Map<K, V> map) {
for (Number i : map.values()) {
if (!i.equals(0)) {
return false;
}
}
return true;
}
public static void stringIntoCharMapWithValues(String string,
Map<Character, Integer> map, int value) {
int length = string.length();
for (int i = 0; i < length; i++) {
char c = string.charAt(i);
if (Character.isWhitespace(c)
|| (!Character.isLetter(c) && !Character.isDigit(c))) {
continue;
}
if (map.containsKey(c)) {
map.put(c, map.get(c) + value);
} else {
map.put(c, value);
}
}
}
public static void testAreAnagrams() {
try {
areAnagrams(null, "a");
} catch (NullPointerException e) {
}
try {
areAnagrams("a", null);
} catch (NullPointerException e) {
}
try {
areAnagrams(null, null);
} catch (NullPointerException e) {
}
assertTrue(areAnagrams("", ""));
assertTrue(areAnagrams("a", "a"));
assertFalse(areAnagrams("a", ""));
assertFalse(areAnagrams("", "a"));
assertTrue(areAnagrams("ab", "ab"));
assertTrue(areAnagrams("ab", "ba"));
assertFalse(areAnagrams("ab", "bc"));
assertFalse(areAnagrams("ab", "b c"));
assertTrue(areAnagrams("ab", "b a"));
assertTrue(areAnagrams(" ab", "ba "));
assertTrue(areAnagrams("a4 b", "4b a"));
assertFalse(areAnagrams("a4 b", "5b a"));
assertFalse(areAnagrams("aa", "a"));
assertTrue(areAnagrams("a,b,c.", "- 'c b a'"));
}
}
Wednesday, August 15, 2012
Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)
/*
Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)
*/
#include <stdio.h>
void reverse(char* cStyleString) {
char temp;
char* leftSwap;
char* rightSwap;
leftSwap = cStyleString; // Position left swapping point at string's start
rightSwap = cStyleString; // Position right swapping point at string's start
while (*rightSwap) { // Repeat until terminating character (\0) is found
rightSwap++; // Traverse string by advancing to the next character
} // End of string now located
rightSwap--; // Backtrack one step from terminating character
while (leftSwap < rightSwap) {
temp = *leftSwap; // Temporarily store character to swap
*leftSwap = *rightSwap;
*rightSwap = temp;
leftSwap++; // Converge to centre of string
rightSwap--; // Converge to centre of string
}
}
int main() {
char cStyleString[] = "Hello, world!";
printf("%s\n", cStyleString);
reverse(cStyleString);
printf("%s\n", cStyleString);
return 0;
}
Insert a spacer character into a given String every n characters from the right
import junit.framework.TestCase;
/**
* Insert a spacer character into a given String every n characters from the
* right.
*/
public class InsertCharacterAfterEveryNCharacters extends TestCase {
public static String insertSpacerAfterNCharactersFromTheRight(char spacer,
int spacing, String string) {
final int length = string.length();
final int newStringCapacity =
length + (int) Math.ceil(length / (double) spacing);
StringBuilder stringBuilder = new StringBuilder(newStringCapacity);
for (int i = length - 1; i >= 0; i--) {
stringBuilder.append(string.charAt(i));
if (i % spacing == 0 && i > 0) {
stringBuilder.append(spacer);
}
}
return stringBuilder.toString();
}
public static void testInsertSpacerAfterNCharactersFromTheRight() {
assertEquals("", insertSpacerAfterNCharactersFromTheRight('-', 8, ""));
assertEquals("1", insertSpacerAfterNCharactersFromTheRight('-', 8, "1"));
assertEquals("11", insertSpacerAfterNCharactersFromTheRight('-', 8, "11"));
assertEquals("11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "11111111"));
assertEquals("1-11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "111111111"));
assertEquals("11111111-11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "1111111111111111"));
}
}
Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures? What if you have to use bit masking to track occurrences?
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
* Implement an algorithm to determine if a string has all unique characters.
* What if you can not use additional data structures? What if you have to use
* bit masking to track occurrences?
*/
public class StringHasAllUniqueCharacters extends TestCase {
public static boolean hasAllUniqueCharacters(String string) {
Map<Character, Boolean> charactersMap = new HashMap<Character, Boolean>();
for (char c : string.toCharArray()) {
if (charactersMap.containsKey(c)) {
return false;
}
charactersMap.put(c, true);
}
return true;
}
public static boolean hasAllUniqueCharactersNoHelperDS(String string) {
final int length = string.length();
for (int i = 0; i < length; i++) {
final char c = string.charAt(i);
for (int j = i + 1; j < length; j++) {
if (c == string.charAt(j)) {
return false;
}
}
}
return true;
}
public static boolean hasAllUniqueCharactersUsingBitMasking(String string) {
final int length = string.length();
final int nBitsToStoreAllUnicodeCharacters =
(int) Math.ceil(Math.log(Character.MAX_CODE_POINT) / Math.log(2d));
BitSet bitSet = new BitSet(nBitsToStoreAllUnicodeCharacters);
for (int i = 0; i < length; i++) {
char c = string.charAt(i);
if (bitSet.get(c)) {
return false;
}
bitSet.set(c);
}
return true;
}
public static void testHasAllUniqueCharacters() {
assertTrue(hasAllUniqueCharacters(""));
assertTrue(hasAllUniqueCharacters("a"));
assertFalse(hasAllUniqueCharacters("aa"));
assertTrue(hasAllUniqueCharacters("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
public static void testHasAllUniqueCharactersNoAdditionalDS() {
assertTrue(hasAllUniqueCharacters(""));
assertTrue(hasAllUniqueCharacters("a"));
assertFalse(hasAllUniqueCharacters("aa"));
assertTrue(hasAllUniqueCharacters("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
public static void testHasAllUniqueCharactersUsingBitMasking() {
assertTrue(hasAllUniqueCharactersUsingBitMasking(""));
assertTrue(hasAllUniqueCharactersUsingBitMasking("a"));
assertFalse(hasAllUniqueCharactersUsingBitMasking("aa"));
assertTrue(hasAllUniqueCharactersUsingBitMasking("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
}
Subscribe to:
Comments (Atom)