public class FindNthToLast {
public static void main(String[] args){
LinkedListNode node
= LinkedListNode.createLinkedList(new int[]{1,2,3,4,5,6,7,8,9});
LinkedListNode.print(node);
System.out.println("\n=====================");
LinkedListNode found = find(node, 2);
System.out.println(found.data);
}
private static int count = 0;
public static LinkedListNode find(LinkedListNode head, int n){
if (head == null){
return null;
}
LinkedListNode found = find(head.next, n);
count++;
if (count==n){
return head;
}
return found;
}
}
public class LinkedListNode {
public int data;
public LinkedListNode next;
public LinkedListNode(int data) {
super();
this.data = data;
}
public static void print(LinkedListNode head){
LinkedListNode current = head;
while (current != null){
System.out.print(current.data+" ");
current = current.next;
}
}
public static LinkedListNode createLinkedList(int[] arr){
LinkedListNode head = new LinkedListNode(arr[0]);
LinkedListNode current = head;
for (int i=1; i<arr.length; i++){
LinkedListNode temp = new LinkedListNode(arr[i]);
current.next = temp;
current = temp;
}
return head;
}
}
Tuesday, 28 January 2014
Find Nth to last element in a singly linked list
Use recursion
Coins
Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents) and pennies (1 cent), write code to calculate the number of ways of representing n cents.
/**
* numberOfWays(25, 3) = numberOfWays(25-1, 0) + numberOfWays(25-5, 1)
* + numberOfWays (25-10, 2) + numberOfWays (25-25, 3)
*
* numberOfWays(25-1, 0) = 1
* numberOfWays(25-5, 1) = numberOfWays(20, 1) = numberOfWays(20-1, 0)
* + numberOfWays(20-5, 1)
* ......
* @author zsunm
*
*/
public class Coin {
private static final int[] COINS = {1, 5, 10, 25};
public static int numberOfWays(int n){
if (n == 0) return 0;
return numberOfWays(n, 3);
}
/**
* The number of ways to represent n cents by using the coins
* up to the specified coinIndex of the COINS array
* Example 1: numberOfWays(10, 2) means the number of ways
* to represent 10 cents using 1 cent, 5 cents, and 10 cents,
* because COINTS[2] = 10
*
* Example 2: numberOfWays(25, 3) means the number of ways
* to represent 25 cents using 1 cent, 5 cents, 10 cents, and 25 cents
* because COINTS[3] = 25
*
* @param n cents
* @param coinIndex the coin index of COINS array that can be used up to
* @return
*/
private static int numberOfWays(int n, int coinIndex) {
if (n < 0){
return 0;
}
if (n == 0){
return 1;
}
int result = 0;
for (int i=0; i<=coinIndex; i++){
result += numberOfWays(n-COINS[i], i);
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(numberOfWays(25));
}
}
Solve Eight Queens problem with 1D array
The following program prints out all solutions for N Queens problem.
There are 92 solutions for 8 Queens.
The solution uses a 1D array and does not use recursion.
There are 92 solutions for 8 Queens.
The solution uses a 1D array and does not use recursion.
public class EightQueen {
private static final int N = 8;
//queens[2]=3, means the queen on row 2 is placed on column 3
private static int[] queens = new int[N];
private static int index = 0;
private static int counter = 0;
public static void placeQueens(){
int previousColumn = -1;
boolean noMoreSolutions = false;
while (!noMoreSolutions){
while (index < N){
int col = getColumnForNextRow(previousColumn);
if (col != -1){
queens[index++] = col;
previousColumn = -1;
}else if (index > 0){
previousColumn = queens[--index];
}else{
noMoreSolutions = true;
System.out.println("No More Solutions");
break;
}
}
if (!noMoreSolutions){
print();
System.out.println("Solution #"+ ++counter);
//Let's find another solution
previousColumn = queens[--index];
}
}
}
private static int getColumnForNextRow(int previousColumn) {
int startCol = previousColumn + 1;
for (int j=startCol; j < N; j++){
if (!canAttackExistingQueens(j)){
return j;
}
}
return -1;
}
private static boolean canAttackExistingQueens(int col) {
for (int i=0; i<index; i++){
if (canAttackQueen(index, col, i, queens[i])){
return true;
}
}
return false;
}
private static boolean canAttackQueen(int row1, int col1, int row2, int col2) {
return sameCol(col1, col2) || sameDiagonal(row1, col1, row2, col2);
}
private static boolean sameCol(int col1, int col2) {
return col1 == col2;
}
private static boolean sameDiagonal(int row1, int col1, int row2, int col2) {
return col1 - col2 == row1 - row2 || col1 - col2 == row2 - row1;
}
private static void print(){
for (int i=0; i<N; i++){
for (int j=0; j<N; j++){
if (queens[i] == j){
System.out.print("Q ");
}else{
System.out.print("* ");
}
}
System.out.println();
}
}
/**
* @param args
*/
public static void main(String[] args) {
placeQueens();
}
}
Subscribe to:
Posts (Atom)