日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )

發布時間:2023/11/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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要單獨算
  • 求字符串長度,使用了兩個類方法
  • 總結

    以上是生活随笔為你收集整理的【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。