Java面試題中高級,java引用數據類型和基本數據類型區別

4步套路,解決動態規劃問題

1、確定問題狀態

  • 提煉最后一步
  • 的問題轉化

2、轉移方程,把問題方程化
3、按照實際邏輯設置初始條件和邊界情況
4、確定計算順序并求解

結合實例感受下:

你有三種硬幣,分別面值2元,5元和7元,每種硬幣都有足夠多。買一本書需要27元。如何用最少的硬幣組合正好付清,不需要對方找錢?

關鍵詞“用最小的硬幣組合正好付清”——“最小的組合”,求最值問題,動態規劃

**正常人第一反應思路:**最少硬幣組合?優先使用大面值硬幣——7+7+7+5=26 額?可求解目標是27啊……改算法——7+7+7+2+2+2=27,總共用了6枚硬幣正好27元.實際正確答案:7+5+5+5+5=27,才用了5枚硬幣。所以這里貪心算法是不正確的。

套路用起來:

第一步,確定問題狀態。

動態規劃問題求解需要先開一個數組,并確定數組的每個元素f[i]代表什么,就是確定這個問題的狀態。類似于解數學題中,設定X,Y,Z代表什么。

A、確定狀態首先提取【最后一步】

最優策略必定是K枚硬幣a1, a2,…, aK 面值加起來是27。

找出不影響最優策略的最后一個獨立角色,這道問題中,那枚最后的硬幣“aK”就是最后一步。把aK提取出來,硬幣aK之前的所有硬幣面值加總是27- aK因為總體求最硬幣數量最小策略,所以拼出27- aK 的硬幣數也一定最少(重要設定)。

B、**轉化子問題。**最后一步aK提出來之后,我們只要求出“最少用多少枚硬幣可以拼出27- aK”就可以了。

這種與原問題內核一致,但是規模變小的問題,叫做子問題。

為簡化定義,我們設狀態f(X)=最少用多少枚硬幣拼出總面值X。我們目前還不知道最后的硬幣aK面額多少,但它的面額一定只可能是2/5/7之一。如果aK是2,f(27)應該是f(27-2) + 1 (加上最后這一枚面值2的硬幣)如果aK是5,f(27)應該是f(27-5) + 1 (加上最后這一枚面值5的硬幣)如果aK是7,f(27)應該是f(27-7) + 1 (加上最后這一枚面值7的硬幣)除此以外,沒有其他的可能了。

至此,通過找到原問題最后一步,并將其轉化為子問題。為求面值總額27的最小的硬幣組合數的狀態就形成了,用以下函數表示:

f(27) = min{f(27-2)+1, f(27-5)+1, f(27-7)+1}

第二步,轉移方程,把問題方程化。

f[X] = min{f[X-2]+1, f[X-5]+1, f[X-7]+1}(動態規劃都是要開數組,所以這里改用方括號表示)

實際面試中求解動態規劃類問題,正確列出轉移方程正確基本上就解決一半了。

但是請問:這與遞歸有什么不同??

遞歸的解法:

// f(X)返回最少用多少枚硬幣拼出Xint f(int X) {// 0元錢只要0枚硬幣if (X == 0) return 0;// 初始化用無窮大(為什么是正無窮?)int res = MAX_VALUE;// 最后一枚硬幣是2元if (X >= 2) {res = Math.min(f(X – 2) + 1, res);}// 最后一枚硬幣是5元if (X >= 5) {res = Math.min(f(X – 5) + 1, res);}// 最后一枚硬幣是7元if (X >= 7) {res = Math.min(f(X – 7) + 1, res);}return res;}

執行圖如下:

要算f(27),就要遞歸f(25)、f(22)、f(20),然后下邊依次遞歸……(三角形表示)。

問題明顯——重復遞歸太多。

這是求f(27),還可以勉強遞歸。如果求f(100)呢?簡直是天文數字。最終結果就是遞歸超市。

求總體最值,一定優先考慮動態規劃不要憨憨的去遞歸。

插入一下~

需要掌握的動態規劃面試解題技巧還包括坐標型、位操型、序列型、博弈型、背包型、雙序列以及一些高難面試題解。

本文篇幅有限無法逐一講清,大家來白嫖我的在線分享吧(純干貨)。

第三步,按照實際邏輯設置邊界情況和初始條件。

**【必做】**否則即使轉移方程正確也大概率無法跑通代碼。

f[X] = min{f[X-2]+1, f[X-5]+1, f[X-7]+1}的邊界情況是[x-2]/[x-5]/[x-7]不能小于0(硬幣面值為正),也不能高于27。

故對邊界情況設定如下:

如果硬幣面值不能組合出Y,就定義f[Y]=正無窮例如f[-1]=f[-2]=…=正無窮;f[1] =min{f[-1]+1, f[-4]+1,f[-6]+1}=正無窮,

**特殊情況:**本題的F[0]對應的情況為F[-2]、F[-5]、F[-7],按照上文的邊界情況設定結果是正無窮。

但是實際上F[0]的結果是存在的(即使用0個硬幣的情況下),F[0]=0。可是按照我們剛剛的設定,F[0]=F[0-2]+1= F[-2]+1=正無窮。

豈不是矛盾?

這種用轉移方程無法計算,但是又實際存在的情況,就必須通過手動定義。

這里手動強制定義初始條件為:F[0]=0.

而從0之后的數值是沒矛盾的,比如F[1]= F[1-2]+1= F[-1]+1=正無窮(正無窮加任何數結果還是正無窮);F[2]= F[2-2]+1= F[0]+1=1……

第四步,確定計算順序并計算求解

那么開始計算時,是從F[1]、F[2]開始呢?還是從F[27]、F[26]開始呢?

判斷計算順序正確與否的原則是:當我們要計算F[X](等式左邊,如F[10])的時候,等式右邊(f[X-2], f[X-5], f[X-7]等)都是已經得到結果的狀態,這個計算順序就是OK的。

實際就是從小到大的計算方式(偶有例外的情況我們后邊再講)。

例如我們算到F[12]的時候,發現F[11]、F[10]、F[9]都已經算過了,這種算法就是對的;而開始算F[27]的時候,發現F[26]還沒有算,這樣的順序就是錯的。

很顯然這樣的情況下寫一個FOR循環就夠了。

回到這道題,采用動態規劃的算法,每一步只嘗試三種硬幣,一共進行了27步。算法時間復雜度(即需要進行的步數)為27*3。

與遞歸相比,沒有任何重復計算。

**原題練習及實際代碼:**這道題是lintcode編號669的Coin Change問題。代碼如下:

public int coinChange(int[] A, int M){// A = [2,5,7]// M = 27int[] f = new int[M + 1];int n = A.length; // 硬幣的種類// 初始化, 0個硬幣f[0] = 0;// f[1], f[2], ... , f[27] = Integer.MAX_VALUEfor (int i = 1; i <= M; i++){f[i] = Integer.MAX_VALUE;}for (int i = 1; i <= M; i++){// 使用第j個硬幣 A[j]// f[i] = min{f[i-A[0]]+1, ... , f[i-A[n-1]]+1}for (int j = 0; j < n; ++j){// 如果通過放這個硬幣能夠達到重量iif (i >= A[j] && f[i - A[j]] != Integer.MAX_VALUE) {// 獲得i的重量的硬幣數就可能是獲得i-A[j]重量硬幣數的方案+1// 拿這個方案數量與原本的方案數打擂臺,取最小值就行f[i] = Math.min(f[i - A[j]] + 1, f[i]);}}}if (f[M] == Integer.MAX_VALUE){return -1;}return f[M];}

最后總結:

1、這是求最值問題,用動態規劃方式求解。2、進入求解過程,先確定問題狀態

  • 提煉最后一步
    (最優策略中使用的最后一枚硬幣aK)
    -子問題轉化 (最少的硬幣拼出更小的面值27-aK)
    3、構建轉移方程 f[X] = min{f[X-2]+1, f[X-5]+1, f[X-7]+1}
    (求min是因為題目要求求最小)
    4、設置初始條件和邊界情況 f[0] = 0, 如果不能拼出Y,f[Y]=正無窮
    5、確定計算順序并計算求解
    f[0], f[1], f[2]……

實際上按照以上4步套路,基本上可以應對絕對大多數的動態規劃面試題。

總結

在這里,由于面試中MySQL問的比較多,因此也就在此以MySQL為例為大家總結分享。但是你要學習的往往不止這一點,還有一些主流框架的使用,Spring源碼的學習,Mybatis源碼的學習等等都是需要掌握的,我也把這些知識點都整理起來了,有需要的朋友可以**【轉發+關注】后點擊這里免費領取!**

面試真題

等都是需要掌握的,我也把這些知識點都整理起來了,有需要的朋友可以**【轉發+關注】后點擊這里免費領取!**

[外鏈圖片轉存中…(img-OtYDajkq-1625571563748)]

Spring源碼筆記

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385718.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小企業服務器設置位置,小企業服務器配置

小企業服務器配置 內容精選換一換使用企業主機安全服務&#xff0c;您將可以同時使用消息通知服務接收告警通知信息&#xff0c;使用統一身份認證服務管理用戶權限&#xff0c;利用云審計服務審計用戶行為。企業主機安全服務的Agent軟件可安裝在華為云ECS服務器/BMS服務器/HECS…

Java面試題及答案2020,kafka教程分享

三面頭條 面試崗位是后臺研發工程師&#xff0c;地點選擇了上海&#xff0c;通過大佬內推&#xff0c;跳過死亡筆試&#xff0c;加上疫情期間&#xff0c;所以直接視頻面&#xff0c;從3點開始&#xff0c;斷斷續續到晚上8點結束。 一共三輪技術面試&#xff0c;每一輪都要寫代…

Java面試題及答案2020,安卓java編程軟件app

一面&#xff08;一個半小時&#xff09; 首先自我介紹 了解Web層開發&#xff1f;數據庫索引了解么&#xff1f;聚簇索引&#xff0c;非聚簇索引&#xff1f;索引分類&#xff1f; 了解數據庫都由哪些引擎&#xff1f;分別有什么區別和使用場景&#xff1f; 了解分布式&…

Java面試題及答案,java對外提供接口

Redis簡介 Redis與Memcached區別Redis優點Redis缺點 Redis數據類型 StringHashListSetSorted set Redis事務 MULTI&EXEC&#xff08;原子執行&#xff0c;并非互斥&#xff09;WATCH&UNWATCH&#xff08;原子執行樂觀鎖&#xff09; Redis分布式鎖 排他鎖 SETNX帶有…

Java面試題及答案,我把所有Java框架整理成了PDF

第1章 初識Redis 初識Redis&#xff0c;帶領讀者進入Redis的世界&#xff0c;了解它的前世今生、眾多特性、應用場景、安裝配置、簡單使用&#xff0c;最后對Redis發展過程中的重要版本進行說明&#xff0c;可以讓讀者對Redis有一個全面的認識。 1.1Redis特性 1.2Redis使用場景…

Java面試題庫,java四舍五入保留小數點后兩位輸出

第5章 持久化 持久化&#xff0c;Redis的持久化功能有效避免因進程退出造成的數據丟失問題&#xff0c;本章首先介紹RDB和AOF兩種持久化配置和運行流程&#xff0c;其次對常見的持久化問題進行定位和優化&#xff0c;最后結合Redis常見的單機多實例部署場景進行優化。 5.1 RDB …

Java面試題庫,java核心技術第十版下載

阿里巴巴篇 1.扎實的計算機專業基礎&#xff0c;包括算法和數據結構&#xff0c;操作系統&#xff0c;計算機網絡&#xff0c;計算機體系結構&#xff0c;數據庫等2.具有扎實的Java編程基礎&#xff0c;理解IO、多線程等基礎框架3.熟練使用Linux系統的常用命令及shell有一定了…

Java面試題整理,java常用排序算法圖解

微服務架構 ①微服務概念&#xff1a; ②Spring Cloud微服務架構&#xff1a; 海量數據處理 ①&#xff1a;經典的海量數據處理面試題 高可用架構 ①基于 Hystrix 實現高可用&#xff1a; ②限流&#xff1a; ③熔斷&#xff1a; 高并發架構 ①消息隊列&#xff1a; ②搜索…

Java面試題2020,單擊更改以將java安裝到其他文件夾

工作的前兩年 如果你不能拼爹&#xff0c;或者不想拼爹&#xff0c;最好的方法是拼實力。 合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于壘土&#xff1b;千里之行&#xff0c;始于足下。 所以&#xff0c;你必須要從基層做起。當然&#xff0c;所謂的基…

Java面試題中高級,javaif循環語句

微服務是什么 微服務起源于2005年Peter Rodgers博士在云端運算博覽會提出的微Web服務(Micro-Web-Service)&#xff0c;根本思想類似于Unix的管道設計理念。2014年&#xff0c;由Martin Fowler 與 James Lewis共同提出了微服務的概念&#xff0c;定義了微服務架構風格是一種通過…

Java面試題及答案2020,java數組循環賦值

什么是ACID&#xff1f; 事務的定義和實現一直隨著數據管理的發展在演進&#xff0c;當計算機越來越強大&#xff0c;它們就能夠被用來管理越來越多數據&#xff0c;最終&#xff0c;多個用戶可以在一臺計算機上共享數據&#xff0c;這就導致了一個問題&#xff0c;當一個用戶…

Java面試題及答案,java底層實現原理

工廠方法模式 Spring 框架使用工廠模式來實現 Spring 容器的 BeanFactory 和 ApplicationContext 接口。Spring 容器基于工廠模式為 Spring 應用程序創建 bean&#xff0c;并管理著每一個 bean 的生命周期。BeanFactory 和 ApplicationContext 是工廠接口&#xff0c;并且在 S…

Java面試題及答案,mysql可視化工具

為什么阿里巴巴的持久層拋棄hibernate&#xff0c;采用MyBatis框架&#xff1f; 原因大概有以下4點&#xff1a; 尤其是需要處理大量數據或者大并發情況的網站服務&#xff0c;這也阿里選擇MyBatis的原因。 MyBatis整體架構 不多講&#xff0c;先看目錄圖 MyBatis源碼筆記文檔…

Java面試題及答案,mysql類型

面試真題以及解析 Web&#xff0c;RESTful API 在微服務中的作用是什么&#xff1f; 微服務架構基于一個概念&#xff0c;其中所有服務應該能夠彼此交互以構建業務功能。因此&#xff0c;要實現這一點&#xff0c;每個微服務必須具有接口。這使得 Web API 成為微服務的一個非…

Java面試題庫,java導入圖片

自我管理 謹言慎行 暢銷書《影響力》提到&#xff0c;因為影響力的巨大差異&#xff0c;娛樂明星比科學家收入高幾萬倍。技術經理管理了N個人&#xff0c;影響力就是N倍&#xff0c;如果言行不端&#xff0c;造成的影響是基層人員的N倍。博主有過一個上級&#xff0c;把粗魯當…

Java面試題庫,java每天定時任務

正文 做了 3~5 年編程開發&#xff0c;你已經積累了不少項目經驗&#xff0c;擴寬了技術廣度&#xff0c;也許已發力成為團隊管理者。到了這個階段&#xff0c;大家卻常有這種感受&#xff1a;感覺自己卡在瓶頸進步緩慢&#xff0c;技術水平很難像早期一樣實現大幅突破&#x…

Java面試題整理,docker可視化監控工具

1關于MySQL&#xff0c;面試官會問哪些問題&#xff1f; 第一個&#xff1a;MySQ性能優化最佳實踐21個&#xff08;有具體的解釋&#xff09;你知道哪些&#xff1f; 為查詢緩存優化你的查詢 EXPLAIN你的SELECT查詢 當只要一行數據時使用LIMIT 1 為搜索字段建索引 在Join表…

Java面試題整理,一線互聯網公司java面試核心知識點

SpringBoot經典之作 進入Spring Boot世界 準備開發環境搭建開發工具 基礎 Spring Boot基礎分層開發Web應用程序響應式編程 進階 Spring Boot進階用ORM操作SQL數據庫接口架構風格——RESTful集成安全框架&#xff0c;實現安全認證和授權集成Redis&#xff0c;實現高并發集成R…

Java開發框架!阿里大牛親手操刀微服務架構實戰

java基礎 1.1java的8種基本數據類型裝箱拆箱 1.2重寫重載封裝繼承多態 1.3 Stack Queue 1.7 Concurrent包 1.8面向對象 1.9 String StringBuffer StringBuilder hashcode equ 1.10 java文件讀取 1.11 Java反射 1.12 JDK NDK JRE JNI 1.13 static和final的區別 1.14 …

Java開發框架!高級java工程師簡歷模板

第一部分必讀系列&#xff1a; 01.學習算法和刷題的思路指南 02.學習數據結構和算法讀什么書 03.動態規劃解題套路框架 04.動態規劃答疑篇 05.動態規劃答疑篇 06.回溯算法解題套路框架 07.二分查找解題套路框架 08.滑動窗口解題套路框架 09.雙指針技巧總結 10.BFS算法套…