1.從順序表(數組)中找到最小值的元素。
思想:遍歷整個順序表,查找最小值元素並記住,遍歷結束就可以獲得整個數組的最小值
public static int findMin(int[] arr) {
if(0 == arr.length || null == arr) { //數組爲空,終止操作
return -1;
}
int minData = arr[0]; //假定0號元素值最小
for(int i=0; i<arr.length; i++) { //循環尋找具有最小值的元素
if(arr[i] < minData) {
minData = arr[i]; //minData記錄當前是最小值的元素
}
}
return minData;
}
2.將數組中所有元素逆置,要求算法空間複雜度爲O(1)。
思想:掃描數組的前半部分,對於元素arr[i](0<=i && i<arr.length/2)
, 將後半部分對應元素進行交換
public static void reverse(int[] arr) {
if(0 == arr.length || null == arr) { //數組爲空,終止操作
return;
}
int temp;
for(int i=0; i<arr.length/2; i++) { //交換arr[i]與arr[arr.length-i-1]
temp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = temp;
}
3.長度爲n的順序表L,編寫一個時間複雜度爲O(n),空間複雜度爲O(1)的算法刪除線性表中所有值爲x的數據元素。
思想:用k記錄順序表中不等於x的元素個數(即需要保存的元素個數),邊掃描順序表邊統計k,並將不等於x的元素向前放置到k位置上,最後修改L的長度。
public class RemoveItem {
public static void main(String[] args) {
int[] arr = {1,3,5,1,4,1,7,1};
int k = 0;
for (int i=0; i<arr.length; i++) {
if(arr[i] != 1) {
arr[k] = arr[i];
k++;
}
}
for (int i = 0; i < k; i++) {
System.out.println(arr[i]);
}
}
}
4.從有序順序表中刪除其值在給定值s與t之間(其中s<t
)的所有元素,如果s或者t不合理或者順序表爲空則顯示出錯信息並退出運行。
思想:先尋找值大於等於s的第一個元素(第一個刪除的元素),然後尋找值大於t的第一個元素(最後一個刪除的元素的下一個元素),要將這段元素刪除,只需直接將後面的元素前移便可。
public static void deleteElem(int[] arr, int s, int t) {
int i, j;
if(s>t || null == arr || 0 == arr.length) {
return;
}
for (i=0; i<arr.length&&arr[i]<s;i++); //尋找值大於等於s的第一個值
if(i >= arr.length) {
return; //所有值都小於s則程序終止
}
for (j=i; j<arr.length&&arr[j]<=t; j++); //尋找值大於t的第一個元素
for(; j<arr.length; i++, j++) {
arr[i] = arr[j]; //前移,填補被刪除的元素
}
for (int m=0; m<i; m++) {
System.out.println(arr[m]);
}
}
5..從順序表中刪除其值在給定值s與t之間(包含s,t,其中s<t
)的所有元素,如果s或者t不合理或者順序表爲空則顯示出錯信息並退出運行。
思想:這裏並不再是有序表,可以借鑑上面算法3的思想,具體不詳述,見下面代碼:
public static void deleteElem(int[] arr, int s, int t) {
if(s>t || null == arr || 0 == arr.length) {
return;
}
int k = 0;
for(int i=0; i<arr.length; i++) {
if(arr[i] < s || arr[i] > t) {
arr[k] = arr[i];
k++;
}
}
for(int i=0; i<k; i++) {
System.out.println(arr[i]);
}
}
6.從有序順序表中刪除所有其值重複餓元素,使表中所有元素都不相同。
思想:注意是有序順序表,值相同的元素一定在連續的位置上,用類似於直接插入排序的思想,初始時將第一個元素看作非重複的有序表。之後順序依次判斷後面的元素是否與前面非重複有序表中的最後一個元素相同,如果相同則繼續向後判斷,如果不同則插入到前面的非重複有序表的最後,直到判斷到整個表尾爲止。