【数据结构与算法经典问题解析--java语言描述】_第21章_学习记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37770023/article/details/82929697

【数据结构与算法经典问题解析--java语言描述】_第21章_学习记录

問題1: 設計一個算法,安照螺旋順序依次輸出矩陣中的元素;

package p21;

import java.util.ArrayList;
import java.util.List;

/**
 * 問題1: 設計一個算法,安照螺旋順序依次輸出矩陣中的元素;
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo01 {
	
	public static void main(String[] args) {
		int[][] matrix ={{0, 0, 0, 0},
				         {3, 4, 4, 1},
				         {3, 6, 5, 1},
				         {2, 2, 2, 1}};
	   List<Integer> resList = Spiral(matrix, 4, 4);
	   for (int i : resList) {
		   System.out.println(i);
	   }		
	}
	
	//算法實現, 時間複雜度O(n) = n^2, 空間複雜度O(n) = 1;
	public static List<Integer> Spiral(int[][] matrix, int m, int n) {
		List<Integer> resList = new ArrayList<Integer>();
		int xStart = 0;
		int yStart = 0;
		int xEnd = n-1;
		int yEnd = m-1;
		while (xStart <= xEnd && yStart <= yEnd) {
			//left --> right;
			for (int i = xStart; i <= xEnd; i++) {
				resList.add(matrix[yStart][i]);
			}
			//up --> down
			if (yEnd > yStart) {
				for (int i = yStart+1; i <= yEnd; i++) {
					resList.add(matrix[i][xEnd]);
				}
			}
			//right --> left
			if (yEnd > yStart && xStart < xEnd) {
				for (int i = xEnd-1; i >= xStart; i--) {
					resList.add(matrix[yEnd][i]);
				}
			}
			//down --> up
			if (yEnd > yStart+1 && xStart < xEnd) {
				for (int i = yEnd-1; i >= yStart+1; i--) {
					resList.add(matrix[i][xStart]);
				}
			}
			xStart++;
			xEnd--;
			yStart++;
			yEnd--;
		}
		return resList;
	}	

}


 問題2: 基於反轉算法的數組旋轉問題。設計一個函數rotate(A[], d, n), 該函數將大小為n的數組旋轉d個元素。e.g, 數組1, 2, 3, 4, 5, 6, 7在經過2 個元素的旋轉后變為3, 4, 5, 6, 7, 1, 2;

package p21;

/**
 * 問題2: 基於反轉算法的數組旋轉問題。設計一個函數rotate(A[], d, n), 該
 * 函數將大小為n的數組旋轉d個元素。e.g, 數組1, 2, 3, 4, 5, 6, 7在經過2
 * 個元素的旋轉后變為3, 4, 5, 6, 7, 1, 2;
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo03 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 4, 5, 6, 7};
		rotate(arr, 2, 7);
		for (int i : arr) {
			System.out.print(i+",");
		}
	}
	
	public static void rotate(int[] arr, int d, int n) {
		reverse(arr, 0, d-1);
		reverse(arr, d, n-1);
		reverse(arr, 0, n-1);
	}
	
	public static void reverse(int[] arr, int start, int end) {
		while (start < end) {
			int temp = arr[start];
			arr[start] = arr[end];
			arr[end] = temp;
			start++;
			end--;
		}
	}

}

 問題3:字符串由詞和空格組成,設計一個程序將字符串中所有空格移動到字符串的最前面,要求僅遍歷數組一次,并且在原字符串中進行調整;

package p21;

/**
 * 問題3:字符串由詞和空格組成,設計一個程序將字符串中所有空格移動到字符串的最
 * 前面,要求僅遍歷數組一次,并且在原字符串中進行調整;
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo04 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		String str = "Hello    World    !!!";
		String resStr = moveSpaceToBegin(str);
		System.out.println(resStr);
	}
	
	public static String moveSpaceToBegin(String str) {
		char[] ch = str.toCharArray();
		int j = ch.length-1;
		for (int i = ch.length-1; i >= 0; i--) {
			if (ch[i] != ' ') {
				ch[j--] = ch[i];
			}
		}
		for (int k = 0; k <= j; k++) {
			ch[k] = ' ';
		}
		return String.valueOf(ch);
	}

}

 問題4:設計一個程序將所有空格移動到字符串的末尾,要求僅遍歷數組一次,並且在原字符串中進行調整;

package p21;

/**
 * 問題4:設計一個程序將所有空格移動到字符串的末尾,要求僅遍歷數組一次,並且在原字符串中進行調整;
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo05 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		String str = "Hello     World    !!!";
		String resStr = moveSpaceToEnd(str);
		System.out.println(resStr);
	}
	
	public static String moveSpaceToEnd(String str) {
		char[] ch = str.toCharArray();
		int j = 0;
		for (int i = 0; i < ch.length; i++) {
			if (ch[i] != ' ' ) {
				ch[j++] = ch[i];
			}
		}
		for (int k = j;  k < ch.length; k++) {
			ch[k] = ' ';
		}
		return String.valueOf(ch);
	}

}

 問題5:移動0到末尾;

package p21;

/**
 * 問題5:移動0到末尾;
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo06 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		int[] arr = {1, 2, 0, 0, 3, 4, 0, 5};
		moveZeroToEnd(arr);
		for (int i : arr) {
			System.out.print(i);
		}
	}
	
	//雙指針的算法實現, 時間O(n)=n, 空間O(n)=1;
	public static void moveZeroToEnd(int[] arr) {
		int j = 0;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] != 0) {
				arr[j++] = arr[i];
			}
		}
		for (int k = j; k < arr.length; k++) {
			arr[k] = 0;
		}
	}

}

扫描二维码关注公众号,回复: 3472446 查看本文章

 問題6:設計一個算法將正數和負數分開,要求正數和負數的相對順序保持不變

package p21;

/**
 * 問題6:設計一個算法將正數和負數分開,要求正數和負數的相對順序保持不變
 * @author Guozhu Zhu
 * @date 2018/10/3
 * @version 1.0
 *
 */
public class Demo07 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		int[] arr = {1, 2, -1, 3, 4, -2, 5, -3};
		solution(arr);
		for (int i : arr) {
			System.out.println(i);
		}
	}
	
	public static void solution(int[] arr) {
		int i, j;
	    for (i = 0, j = 0; i < arr.length; i++) {
	    	if (arr[i] < 0) {
	    		swap(arr, j++, i);
	    	}
	    }
	    	
	}
	
	public static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

}


 

猜你喜欢

转载自blog.csdn.net/weixin_37770023/article/details/82929697