主頁 > 軟體設計 > 【幾數之和系列】四數之和都不會做,面試官讓我回去看力扣第一題

【幾數之和系列】四數之和都不會做,面試官讓我回去看力扣第一題

2021-12-29 08:42:20 軟體設計

??引言??
大家好,我是執梗,今天為大家講解的是力扣經典的幾數之和系列,有句話說得好——有人夜里看海,有人力扣第一題都做不出來,大家應該都知道力扣的第一題是兩數之和,但其實兩數之和只是一個起始,在進階的還有三數之和,四數之和以及四數相加等等,今天我為大家將這一系列從易到難為大家整合好,其中詳細決議各種方法,幫助大家總結其中規律,以達到舉一反三的效果建議大家收藏,方便訓練,

同時在這為兄弟們推薦我的鏈表專題,幫助大家手撕鏈表,系統訓練——鏈表專題

📒博客首頁:執梗的博客

🎉歡迎關注🔎點贊👍收藏??留言📝

?? :熱愛Java與演算法學習,期待一起交流!

🙏作者水平很有限,如果發現錯誤,求告知,多謝!

🌺有問題可私信交流!!!

??導航助手??

🍋1.刷題與觀看須知

🍋2.逐步訓練,鏖戰力扣

🐱 1.兩數之和

🐭2.兩數之和||——輸入有序陣列

🐸3.兩數之和IV——輸入BST

🐶4.三數之和

🐯5.四數之和

🐷6.四數相加ll

🍋3.刷題總結


🍋1.刷題與觀看須知

幾數幾何系列是力扣最經典的系列套題之一,它的每道題解法都非常多樣化,用到了各種各樣的演算法知識,比如暴力列舉、哈希、排序+雙指標等等,但是,雖然很多人能做出來,但是卻只會一種樸素的解法,這就感到沾沾自喜了,這類題一定要會做到舉一反三觸類旁通,希望大家每道題都能多樣化解題,同時總結出這類題的規律

🍋2.逐步訓練,鏖戰力扣

🐱 1.兩數之和

給定一個整數陣列 nums 和一個整數目標值 target,請你在該陣列中找出 和為目標值 target 的那 兩個 整數,并回傳它們的陣列下標,

你可以假設每種輸入只會對應一個答案,但是,陣列中同一個元素在答案里不能重復出現,

你可以按任意順序回傳答案,

題目鏈接:兩數之和

作為力扣的第一題,它是很多人成神的起點,這道題也有著自己的美麗

題目分析:第一個想到肯定是暴力遍歷,其次是利用哈希表,哈希表的解法也有不同型別,這里我們用的是Hashmap,用key存放值,value存放下標,在遍歷陣列nums[i]的同時尋找哈希表內是否有符合的數,有則回傳兩個下標,無則將nums[i]放入哈希表中,

1.暴力遍歷

時間復雜度O(N^2):使用兩層for回圈,最壞的情況每兩個數都要被遍歷幾次

空間復雜度O(1):常數級的陣列空間

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
 }

2.利用HashMap

時間復雜度O(N) :只遍歷了一次陣列

空間復雜度O(N):主要為哈希表的開銷

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n=nums.length;
        //key存放值,value存放下標
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<n;i++){
            //找到了
            if(map.containsKey(target-nums[i])){
                //回傳下標
                return new int[]{map.get(target-nums[i]),i};
            }
            //沒找到放入map中
            map.put(nums[i],i);
        }
        //遍歷結束仍然未找到
        return new int[0];
    }
}

🐭2.兩數之和||——輸入有序陣列

給定一個已按照 非遞減順序排列 的整數陣列 numbers ,請你從陣列中找出兩個數滿足相加之和等于目標數 target ,

函式應該以長度為 2 的整數陣列的形式回傳這兩個數的下標值,numbers 的下標 從 1 開始計數 ,所以答案陣列應當滿足 1 <= answer[0] < answer[1] <= numbers.length ,

你可以假設每個輸入 只對應唯一的答案 ,而且你 不可以 重復使用相同的元素,

題目鏈接:兩數之和||——輸入有序陣列

思路分析:這道題可以同上一道一樣使用暴力求解以及哈希表,但那是針對與無序陣列的,因為是一個排好序的陣列,我們自然要想到雙指標,從兩頭開始遍歷,當兩指標相加的元素大于target,右指標向左移動,當小于target時,讓左指標右移,

時間復雜度:O(n),其中n是陣列的長度,兩個指標移動最多一共n次

空間復雜度:O(1)

class Solution {
    public int[] twoSum(int[] numbers, int target) {
         int n=numbers.length;
         int left=0;
         int right=n-1;
         while(left<right){
             int count=numbers[left]+numbers[right];
             //找到了,但是下標要加1,因為題目要求
             if(count==target){
                 return new int[]{left+1,right+1};
             //加起來太大了,right--,這樣count會變小
             }else if(count>target){
                 right--;
             //加起來太小了,left++,這樣count會變大
             }else{
                 left++;
             }
         }
         return new int[0];
    }
}

🐸3.兩數之和IV——輸入BST

給定一個二叉搜索樹 root 和一個目標結果 k,如果樹中存在兩個元素且它們的和等于給定的目標結果,則回傳 true

題目鏈接:兩數之和 IV - 輸入 BST

題目分析:這道題與前面的兩數之和類似,只不過是元素存放的形式變成了樹,我們同樣可以利用Hashset來遍歷樹,

方法:Hashset加遍歷樹,判斷當前root時,set中是否存在k-root.val,如果存在直接回傳true,不存在的話將此時的root.val存放進set中,同時去左子樹和右子樹中繼續查找,

時間復雜度O(n),n為節點的數量,最壞的情況下,整棵樹被遍歷一次

空間復雜度O(n),最壞的情況下,set存盤n個節點的值,

class Solution {
    public boolean findTarget(TreeNode root, int k) {
        Set<Integer> set=new HashSet<>();
        return find(root,k,set);
    }
    public boolean find(TreeNode root,int k,Set set){
        //如果root為空直接回傳false
        if(root==null) return false;
        if(set.contains(k-root.val)){
            return true;
        }
        //這個沒找到就加入到set集合中
        set.add(root.val);
        //同時去左子樹和右子樹查找
        return find(root.left,k,set)||find(root.right,k,set);
    }
}

🐶4.三數之和

給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重復的三元組,

注意:答案中不可以包含重復的三元組,

題目鏈接:三數之和

題目分析:這道題和兩數之和看上去類似,但做法卻不相同,難度也不在一個檔次,樸素暴力的做法再最后幾個例子會超時

方法1:樸素暴力(超時

時間復雜度O(N^3)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        int n=nums.length;
        List<List<Integer>> list=new ArrayList<>();
        for(int i=0;i<n-2;i++){
            for(int j=n-1;j>i+1;j--){
                int x=i+1;
                while(x<j){
                int count=nums[i]+nums[x]+nums[j];
                if(count==0){
                    List<Integer> arr=new ArrayList<>();
                    arr.add(nums[i]);
                    arr.add(nums[x]);
                    arr.add(nums[j]);
                    if(!list.contains(arr)){
                        list.add(arr);
                    }
                    x++;
                }else if(count>0){
                    break;
                }else{
                    x++;
                }
            }
            }
        }
        return list;
    }
}

方法2:排序加雙指標

思路:在為了方便去重和減少遍歷次數,我們應該保證三指標滿足i<j<k的關系,i我們通過for回圈固定,j和k從兩頭向內移動,

時間復雜度O(n^2):陣列排序O(nlogn),遍歷陣列O(n),雙指標遍歷O(n),總體O(n^2)

空間復雜度O(1)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //對陣列排序
        Arrays.sort(nums);
        int n=nums.length;
        List<List<Integer>> list=new ArrayList<>();
        for(int i=0;i<n-2;i++){
            //定一個i,移動兩指標j,k,注意j是從末尾開始移動
           int j=i+1;
           int k=n-1;
           while(j<k){
               int count=nums[i]+nums[j]+nums[k];
               //找到符合的
               if(count==0){
                   List<Integer> arr=new ArrayList<>();
                   arr.add(nums[i]);
                   arr.add(nums[j]);
                   arr.add(nums[k]);
                   //為了去重
                   if(!list.contains(arr)){
                       list.add(arr);
                   }
                   j++;
                   k--;
                //加起來太大,讓k--從而和變小
               }else if(count>0){
                   k--;
                //加起來太小,讓j++從而和變大
               }else{
                   j++;
                   }
              }
        }
        return list;
    }
}

對上述代碼可進行優化:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);//排序,nums變成遞增陣列
        List<List<Integer>> res = new ArrayList<>();
        //k < nums.length - 2是為了保證后面還能存在兩個數字
        for(int k = 0; k < nums.length - 2; k++){
            if(nums[k] > 0) break;//若nums[k]大于0,則后面的數字也是大于零(排序后是遞增的)
            if(k > 0 && nums[k] == nums[k - 1]) continue;//nums[k]值重復了,去重
            int i = k + 1, j = nums.length - 1;//定義左右指標
            while(i < j){
                int sum = nums[k] + nums[i] + nums[j];
                if(sum < 0){
                    while(i < j && nums[i] == nums[++i]);//左指標前進并去重
                } else if (sum > 0) {
                    while(i < j && nums[j] == nums[--j]);//右指標后退并去重
                } else {
                    res.add(new ArrayList<Integer>(Arrays.asList(nums[k], nums[i], nums[j]);
                    while(i < j && nums[i] == nums[++i]);//左指標前進并去重
                    while(i < j && nums[j] == nums[--j]);//右指標后退并去重
                }
            }
        }
        return res;
    }
}

🐯5.四數之和

給你一個由 n 個整陣列成的陣列 nums ,和一個目標值 target ,請你找出并回傳滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] (若兩個四元組元素一一對應,則認為兩個四元組重復):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意順序 回傳答案 ,

題目鏈接:四數之和

題目思路:這道題是在三數之和的基礎之上個進階,也可以說是兩數之和的進階,只不過變成了四個數,我們不可能用4個for回圈遍歷,而且還得去重,肯定是會超時的,這時我們同樣可以利用三數之和的性質,先將陣列排序,利用四個指標i,p1,p2,j,同時保證i<p1<p2<j,每次固定i和j,判斷四個下標相加的和如果比target大,讓p2--,如果比target小,讓p1++,如果相等就放入到答案集合中,

方法: 排序加雙指標

時間復雜度:O(n^3)

空間復雜度: O(logn)

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums);
        int n=nums.length;
        //i得保證后面還得有三個位,所以<n-3
        for(int i=0;i<n-3;i++){
            //得保證和i之間還有兩個位,所以>i+2
            for(int j=n-1;j>i+2;j--){
                int x=nums[i]+nums[j];
                //兩指標開始的位置
                int p1=i+1;
                int p2=j-1;
                while(p1<p2){
                    int count=x+nums[p1]+nums[p2];
                    if(count==target){
                        List<Integer> arr=new ArrayList<>();
                        arr.add(nums[i]);
                        arr.add(nums[j]);
                        arr.add(nums[p1]);
                        arr.add(nums[p2]);
                        //去重
                        if(!list.contains(arr)){
                          list.add(arr);  
                        }                       
                        p1++;
                        p2--;
                    }else if(count>target){
                        p2--;
                    }else{
                        p1++;
                    }
                }
            }
        }
        return list;
    }
}

🐷6.四數相加ll

給你四個整數陣列 nums1、nums2、nums3 和 nums4 ,陣列長度都是 n ,請你計算有多少個元組 (i, j, k, l) 能滿足:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

題目鏈接:四數相加ll

題目思路:這道題其實比上一道題四數之和要簡單一些,不過它卻也有自己比較難處理的地方,我們不可能用四個for回圈遍歷,因為即使能遍歷不超時,去重的步驟也是很麻煩的,其實也相當于又是兩數之和的進階,我們可以將陣列兩兩分組,A組和B組遍歷相加,將結果作為key,value當做該結果出現的次數,然后再遍歷C組和D組相加的和為count,去判斷map中是否有和count相加為0的key,如果有則加上該key對應的value,這樣相當于進行了兩次O(n^2)的遍歷,總體來說還是O(n^2)的世界復雜度

方法:分組+哈希表

時間復雜度O(n^2):兩個兩層for回圈,總體來時間復雜度還是O(n^2)

空間復雜度O(n^2):哈希映射需要的空間,最壞的情況下存入的值個數位n^2,也就需要O(n^2)的空間

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> map=new HashMap<>();
        int n=nums1.length;
        //用來統計答案
        int anser=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                int count=nums1[i]+nums2[j];
                //已存在
                if(map.containsKey(count)){
                    //讓出現的次數加1,也就是value
                   map.put(count,map.get(count)+1); 
                }else{
                    //未存在,放入map中,value為1
                    map.put(count,1);
                }
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                int count2=nums3[i]+nums4[j];
                //找到匹配的
                if(map.containsKey(-count2)){
                    //加上value,也就是出現的次數
                    anser+=map.get(-count2);
                }
            }
        }
        return anser;
    }
}

🍋3.刷題總結

幾數之和的題目都非常的干貨,深度地考察了我們演算法基礎能力的實踐應用,特別是對哈希能力的訓練,因為哈希是經典的以空間換時間,如果我們不用哈希就會超時,而且去重也非常麻煩,其次是雙指標的運用,因為幾數之和的題目資料大部分都在陣列中,在陣列中找元素大部分都離不開雙指標演算法,大家做完這型別的題目一定要多總結其中的規律,從二數到三數到四數,它的變化是怎樣,做法又如何變化,這樣才能高效刷題,早日成神! 后續我也會出哈希專題系列以及雙指標專題系列

如果有用,希望兄弟們三連多多支持一下!!!感謝


文末驚喜:

Java學習路線總結,搬磚工逆襲Java架構師

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/396258.html

標籤:其他

上一篇:只有數學好才能當程式員?

下一篇:【歷史上的今天】12 月 28 日:馮·諾伊曼誕生;林納斯·托瓦茲出生;CSDN 正式上線

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more