1 題目
1295. 統計位數為偶數的數字
給你一個整數數組 nums,請你返回其中位數為 偶數 的數字的個數。
示例 1:
輸入:nums = [12,345,2,6,7896]
輸出:2
解釋:
12 是 2 位數字(位數為偶數)
345 是 3 位數字(位數為奇數)
2 是 1 位數字(位數為奇數)
6 是 1 位數字 位數為奇數)
7896 是 4 位數字(位數為偶數)
因此只有 12 和 7896 是位數為偶數的數字
示例 2:
輸入:nums = [555,901,482,1771]
輸出:1
解釋:
只有 1771 是位數為偶數的數字。
提示:
1 <= nums.length <= 500
1 <= nums[i] <= 10^5
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-numbers-with-even-number-of-digits
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2 分析
- 求整數位數(可求!有方法!)
- 位數是不是偶數
求整數位數的方法
- 直接使用整數求長度
- 轉換為字符串求長度
提示:
1 <= nums.length <= 500
1 <= nums[i] <= 10^5
這是關鍵信息。
- 數組個數最多500
- 每個元素最多10000
備注:此處,官網的輸入測試用例居然有
100000
,這應該是bug,不用理會。
關注限定條件!
- 數少的,甚至可以手算
- 數較多的,需要一般算法
- 數量極大的,需要高級算法
3 代碼
3.1 按照int求長度
極其簡單!
假定傳入int n
C++代碼:
while(n != 0){count++;n /= 10;
}
適用范圍:所有整數(正數,0,負數)
3.2 轉換為字符串求長度
先將int轉換為字符串,然后直接求出長度,看看是不是偶數,一個表達式到位,這里只求長度。
Java代碼:
int n = -100;
System.out.println(String.valueOf(n).length());
適用范圍:自然數(正數數,0)
負數不行!因為有“-”,Because it has a minus sign.
3.3 題解
3.3.1 直接求(若可以輸入0,就會有問題)
框架思維
public int findNumbers(int[] nums) {int result = 0; // 我要得到的結果存在這里return result; // 返回這個結果}
Java
public int findNumbers(int[] nums) {int result = 0;int digitCount = 0;for(int i:nums){digitCount = 0;while(i != 0){digitCount++;i /= 10;}if(digitCount % 2 == 0)result++;}return result;}
面向對象:Every element in the array ‘nums’.
核心結構:求int的位數
思路框架
- 遍歷每一個元素
- 求整數位數
- 看看是不是偶數
不管數據有多大,只要是整數,都可以(除了0)!但是數據太大的話,就太慢了。
- 時間復雜度 O(n2)
- 空間復雜度O(1)
額外注意:0會報錯,0是1位數,當前算法會判斷0是0位數,就死了,特殊情況單獨處理即可。
3.3.2 轉字符串
Java
public int findNumbers(int[] nums) {int count = 0;int result = 0;for(int i:nums){if(String.valueOf(i).length() % 2 == 0)result++;}return result;}
對于大規模數據,好用!
需要注意負數的處理,取其絕對值再做。
- 時間復雜度 O(n)
- 空間復雜度O(1)
3.4 特殊法題解:根據限定條件求
public int findNumbers(int[] nums) {int result = 0;for(int i:nums){if((i >= 10 && i <= 99) || (i >= 1000 && i <= 9999))result++;}return result;}
此處在力扣會報錯,100000
不對,但是,這與題目不符,應該是測試用例庫錯誤!不用理會不重要。
當給定一些特殊的限定范圍,可以使用特殊法,但是不具備參考價值,沒有通用性。
3.5 方法比較分析 與 數據限定范圍重要性
根據每個方法的分析,可以知道數據范圍的重要性,范圍不同,算法就不同。
本題面向數組內的元組,因此遍歷肯定是要的,for或者for each。
別的沒啥好說的。
4 收獲
4.1 一定要關注限定范圍,你處于真實世界!
4.2 盡可能一次提交正確,不要使用提交試錯,比賽也不允許
4.2 面向對象的算法設計 & 清零思維
很難的題目都是由小題目構成
我們需要抽絲剝繭,找到我們所面對的那個對象的算法,只關注它,然后再擴大一層,看看需不需要清零操作,類似往外推。
自外而內,自內而外。
4.3 框架思維
框架一:方法結果及其返回
我想象我要得到這個結果,我把它存在這里,然后返回,之后,我再看看我該怎么做。
public int findNumbers(int[] nums) {int result = 0; // 我要得到的結果存在這里return result; // 返回這個結果}
**要靈活使用!**例如特殊情況,直接返回就可以,不要再賦值了……
框架二:遍歷數組元素
for(int i:nums){}
for(int i = 0;i < nums.length();i++){}
框架三:求正數位數
框架四:特殊情況單獨列出
4.4 追求邏輯上的簡潔,而不是代碼上的簡潔
5 第二掌 2020.06.11
重新做一遍,新的感悟
- 偶數的定義:
整數 % 2 == 0;
- 求整數為數的循環法,0要單獨算
- 求字符串長度,使用了兩個類方法