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.从有序顺序表中删除所有其值重复饿元素,使表中所有元素都不相同。
思想:注意是有序顺序表,值相同的元素一定在连续的位置上,用类似于直接插入排序的思想,初始时将第一个元素看作非重复的有序表。之后顺序依次判断后面的元素是否与前面非重复有序表中的最后一个元素相同,如果相同则继续向后判断,如果不同则插入到前面的非重复有序表的最后,直到判断到整个表尾为止。