19年9月份面試題集合【排序】

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端。
/**
* 冒泡排序
* 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
* 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
* 針對所有的元素重複以上的步驟,除了最後一個。
* 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
* @param numbers 需要排序的整型數組
*/

public static void bubbleSort(int[] numbers)
{
    int temp = 0;
    int size = numbers.length;
    for(int i = 0 ; i < size-1; i ++)
    {
    for(int j = 0 ;j < size-1-i ; j++)
    {
        if(numbers[j] > numbers[j+1])  //交換兩數位置
        {
        temp = numbers[j];
        numbers[j] = numbers[j+1];
        numbers[j+1] = temp;
        }
    }
    }
}

快速排序的基本思想:

通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,則分別對這兩部分繼續進行排序,直到整個序列有序。

1.查找中軸(最低位作爲中軸)所在位置

/**
* 查找出中軸(默認是最低位low)的在numbers數組排序後所在位置
*
* @param numbers 帶查找數組
* @param low 開始位置
* @param high 結束位置
* @return 中軸所在位置
* 參數說明:
* – 待排序的數組
* – 數組的左邊界(例如,從起始位置開始排序,則=0)
* – 數組的右邊界(例如,排序截至到數組末尾,則=a.length-1)
*/

public static int getMiddle(int[] numbers, int low,int high)
{
    int temp = numbers[low]; //數組的第一個作爲中軸
    while(low < high)
    {
        while(low < high && numbers[high] > temp)
        {
            high--;
        }
        numbers[low] = numbers[high];//比中軸小的記錄移到低端
        while(low < high && numbers[low] < temp)
        {
            low++;
        }
        numbers[high] = numbers[low] ; //比中軸大的記錄移到高端
    }
    numbers[low] = temp ; //中軸記錄到尾
    return low ; // 返回中軸的位置
}

/**
* 分治方法調用快速排序,Main函數
* @param numbers 帶排序數組
* @param low 開始位置
* @param high 結束位置
*/

 public static void quickSort(int[] numbers,int low,int high)
    {
        if(low < high)
        {
          int middle = getMiddle(numbers,low,high); //將numbers數組進行一分爲二
          quickSort(numbers, low, middle-1);   //對低字段表進行遞歸排序
          quickSort(numbers, middle+1, high); //對高字段表進行遞歸排序
        }
    
    }

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態方法(對集合的搜索、排序、線程安全化等),大多數方法都是用來處理線性表的。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

public class CollectionsTest {
	public static void main(String[] args) {
		ArrayList nums = new ArrayList();
		nums.add(8);
		nums.add(-3);
		nums.add(2);
		nums.add(9);
		nums.add(-2);
		
		System.out.println("集合是否爲空:" + nums.isEmpty());
		
		System.out.println("默認順序:" + nums);
		Collections.reverse(nums);
		System.out.println("反轉後順序:" + nums);
		
		Collections.sort(nums);
		System.out.println("排序後順序:" + nums);
		
		Collections.shuffle(nums);
		System.out.println("混淆後順序:" + nums);
		// 下面只是爲了演示定製排序的用法,將int類型轉成string進行比較
		Collections.sort(nums, new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				String s1 = String.valueOf(o1);
				String s2 = String.valueOf(o2);
				return s1.compareTo(s2);
			}

		});
		System.out.println("指定排序後順序:" + nums);
		System.out.println("最大的值是:" + Collections.max(nums));
		System.out.println("最小的值是:" + Collections.min(nums));
	}
}

Iterator和ListIterator區別
我們在使用List,Set的時候,爲了實現對其數據的遍歷,我們經常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍歷的過程,只需要每次取出一個你想要的數據進行處理就可以了。

但是在使用的時候也是有不同的。List和Set都有iterator()來取得其迭代器。對List來說,你也可以通過listIterator()取得其迭代器,兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在以下方面:

  1. ListIterator有add()方法,可以向List中添加對象,而Iterator不能

  2. ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

  3. ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。

  4. 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

2、Java是值傳遞還是引用傳遞?
首先就把結論表明—>Java是值傳遞還是引用傳遞起決於傳遞的參數是基本數據類型(int,byte,long等)還是引用數據類型(String和類變量)。

3、列出常見的狀態碼和意義

200 OK

請求正常處理完畢

204 No Content

請求成功處理,沒有實體的主體返回

206 Partial Content

GET範圍請求已成功處理

301 Moved Permanently

永久重定向,資源已永久分配新URI

302 Found

臨時重定向,資源已臨時分配新URI

303 See Other

臨時重定向,期望使用GET定向獲取

304 Not Modified

發送的附帶條件請求未滿足

307 Temporary Redirect

臨時重定向,POST不會變成GET

400 Bad Request

請求報文語法錯誤或參數錯誤

401 Unauthorized

需要通過HTTP認證,或認證失敗

403 Forbidden

請求資源被拒絕

404 Not Found

無法找到請求資源(服務器無理由拒絕)

500 Internal Server Error

服務器故障或Web應用故障

503 Service Unavailable

服務器超負載或停機維護**

封裝,繼承,多態只是面向對象的三大特性,但是在設計程序的時候並不是說類的結構使用到了(或是體現出了)這三個特性就是面向對象,
其實真正的面向對象設計是要符合下面的五大原則,
面向對象的五大基本原則
單一職責原則(SRP)
開放封閉原則(OCP)
里氏替換原則(LSP)
依賴倒置原則(DIP)
接口隔離原則(ISP)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章