1. 程式人生 > >Java&LeetCode 初入門——069. x 的平方根

Java&LeetCode 初入門——069. x 的平方根

Java&LeetCode 初入門——069. x 的平方根

文內程式碼全部採用JAVA語言。

題目

實現 int sqrt(int x) 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

測試用例

示例 1:

輸入: 4
輸出: 2

示例 2:

輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842..., 
     由於返回型別是整數,小數部分將被捨去。

個人解法

數學上的手動求解平方根用的是二分法。二分法比較簡單,直接上程式碼。範圍從左右兩邊往中間收縮。左邊起始i=0,右邊起始位j=x,每次檢查中間值(i+j)/2的平方,和x進行比較。1實在是放不進去,就單獨處理了。
執行用時: 25 ms, 在Sqrt(x)的Java提交中擊敗了86.16% 的使用者。尚可。
注意為了防止從溢位,中間值的平方應該設為long形,反正用int百分百要溢位。

class Solution {
    public int mySqrt(int x) {
		int i=0;
		int j=x;
		if (x==1) {
			return 1;
		}
		while (i+1<j) {
			long temp=(i+j)/2;
			if (x<(temp*temp)) {
				j=(int)temp;
			}else if (x>=temp*temp) {
				i=(int)temp;
			}
		}
		return i;
	}
}

也有簡單粗暴的求法,就是從0開始遍歷,滿足目標x就輸出,不過速度就慢多了。大概要81 ms。

class Solution {
    public int mySqrt(int x) {
		int ans = 0;
		for (long i = 0; i <= x; i++) {
			if (i*i<=x && (i+1)*(i+1)>x) {
				ans=(int)i;
				break;
			}
		}
		return ans;
	}
}

評論區解法

評論區很多就直接呼叫math.sqrt();雖然很快但是不符合題目的要求。
二分法應該是最優解法了,至於如何把程式碼寫的又簡潔,執行速度又快,就需要進一步學習了。