1. 程式人生 > >leetcode-268-缺失數字(missing number)-java

leetcode-268-缺失數字(missing number)-java

題目及測試

package pid268;
/* 缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。

示例 1:

輸入: [3,0,1]
輸出: 2

示例 2:

輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

說明:
你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?





*/
public class main {
	
	public static void main(String[] args) {
		int[][] testTable = {{3,0,1},{9,6,4,2,3,5,7,0,1},{0,1,2,3},{1,2,3},{0}};
		for(int i=0;i<testTable.length;i++){
			test(testTable[i]);
		}
		
	}
		 
	private static void test(int[] ito) {
		Solution solution = new Solution();
		long begin = System.currentTimeMillis();
		System.out.println("ito= ");
		for(int i=0;i<ito.length;i++){
			System.out.print(ito[i]+" ");
		}
		System.out.println();
		int rtn;
		rtn=solution.missingNumber(ito);//執行程式
		long end = System.currentTimeMillis();		
		System.out.println("rtn="+rtn);
		System.out.println();
		System.out.println("耗時:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,2ms,較快)
先遍歷一遍得到max值
然後求得0-max的和 用公式=sum
用sum減去所有的數
如果不為0,則必為這個數
如果為0
有兩種可能
012 和12
第一種結果為 3 第二種 0
如果length=3不與max相同,則為max+1
如果length=max 則為0

package pid268;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;



public class Solution  {
public int missingNumber(int[] nums) {
	//額外情況可能性
	//012  3
	//12  0
    int max=0;
    int sum=0;
    int length=nums.length;
    if(length==0){
    	return 0;
    }
    for(int i=0;i<length;i++){
    	if(nums[i]>max){
    		max=nums[i];
    	}
    }
    sum=(1+max)*max/2;
    for(int i=0;i<length;i++){
    	sum=sum-nums[i];
    }
    if(sum==0&&max!=length){
    	return max+1;
    }
    else{
    	return sum;
    }

    }
}

解法2(別人的)
可以發現,總共n個,長度n-1,所以真正的max必為length,不用遍歷求max,而且不在中間用公式求和,直接+i-num[i]即可

public int missingNumber(int[] nums) {
		// i的範圍是0~nums.length-1,算上nums.length(N)就是0~N所有數字
		int res = nums.length;
		for (int i = 0; i < nums.length; i++) {
			res += (i - nums[i]);
		}
		return res;
	}