深入解析力扣166題:分數到小數(模擬長除法與字符串操作詳解及模擬面試問答)

力扣166題:分數到小數

在本篇文章中,我們將詳細解讀力扣第166題“分數到小數”。通過學習本篇文章,讀者將掌握如何使用多種方法來解決這一問題,并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋和ASCII圖解,以便于理解。

問題描述

力扣第166題“分數到小數”描述如下:

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字符串形式返回小數。如果小數部分是循環小數,則將循環部分括在括號內。

示例 1:

輸入: numerator = 1, denominator = 2
輸出: "0.5"

示例 2:

輸入: numerator = 2, denominator = 1
輸出: "2"

示例 3:

輸入: numerator = 2, denominator = 3
輸出: "0.(6)"

解題思路

方法一:模擬長除法
  1. 初步分析

    • 使用長除法模擬計算小數部分,并記錄每一步余數的位置來檢測循環。
    • 使用哈希表存儲余數的位置,如果發現重復的余數,則表示循環節開始。
  2. 步驟

    • 處理分子和分母的符號,計算整數部分。
    • 模擬長除法計算小數部分,記錄每一步余數的位置。
    • 如果發現重復的余數,則將循環部分括在括號內。
代碼實現
def fractionToDecimal(numerator, denominator):if numerator == 0:return "0"result = []if (numerator < 0) ^ (denominator < 0):result.append("-")numerator, denominator = abs(numerator), abs(denominator)result.append(str(numerator // denominator))remainder = numerator % denominatorif remainder == 0:return "".join(result)result.append(".")remainders = {}while remainder != 0:if remainder in remainders:result.insert(remainders[remainder], "(")result.append(")")breakremainders[remainder] = len(result)remainder *= 10result.append(str(remainder // denominator))remainder %= denominatorreturn "".join(result)# 測試案例
print(fractionToDecimal(1, 2))  # 輸出: "0.5"
print(fractionToDecimal(2, 1))  # 輸出: "2"
print(fractionToDecimal(2, 3))  # 輸出: "0.(6)"
ASCII圖解

假設輸入為 numerator = 2denominator = 3,圖解如下:

2 ÷ 3 = 0.6666...步驟:
整數部分: 0
小數部分:
2 * 10 = 20, 20 ÷ 3 = 6, 余數 = 2
2 * 10 = 20, 20 ÷ 3 = 6, 余數 = 2 (循環開始)結果:0.(6)
方法二:通過字符串操作
  1. 初步分析

    • 直接通過字符串操作來構建結果字符串。
    • 使用哈希表記錄每個余數出現的位置,檢測循環節。
  2. 步驟

    • 處理分子和分母的符號,計算整數部分。
    • 使用字符串操作計算小數部分,記錄每個余數的位置。
    • 如果發現重復的余數,則將循環部分括在括號內。
代碼實現
def fractionToDecimal(numerator, denominator):if numerator == 0:return "0"sign = "-" if (numerator < 0) ^ (denominator < 0) else ""numerator, denominator = abs(numerator), abs(denominator)integer_part = str(numerator // denominator)remainder = numerator % denominatorif remainder == 0:return sign + integer_partresult = [sign + integer_part + "."]remainder_map = {}while remainder != 0:if remainder in remainder_map:result.insert(remainder_map[remainder], "(")result.append(")")breakremainder_map[remainder] = len(result)remainder *= 10result.append(str(remainder // denominator))remainder %= denominatorreturn "".join(result)# 測試案例
print(fractionToDecimal(1, 2))  # 輸出: "0.5"
print(fractionToDecimal(2, 1))  # 輸出: "2"
print(fractionToDecimal(2, 3))  # 輸出: "0.(6)"

復雜度分析

  • 時間復雜度
    • 模擬長除法方法:O(n),其中 n 是小數部分的長度,主要消耗在余數的檢測和計算上。
    • 字符串操作方法:O(n),其中 n 是小數部分的長度,主要消耗在字符串構建和余數檢測上。
  • 空間復雜度
    • 模擬長除法方法:O(n),需要額外的哈希表空間來存儲余數的位置。
    • 字符串操作方法:O(n),需要額外的哈希表空間來存儲余數的位置。

模擬面試問答

問題 1:你能描述一下如何解決這個問題的思路嗎?

回答:我們需要將分數轉換為小數,并檢測是否存在循環小數。可以使用模擬長除法的方法,記錄每一步余數的位置來檢測循環。如果發現重復的余數,則表示循環節開始,將循環部分括在括號內。另一種方法是通過字符串操作直接構建結果,使用哈希表記錄每個余數出現的位置,檢測循環節。

問題 2:為什么要使用哈希表記錄余數的位置?

回答:使用哈希表記錄余數的位置可以有效檢測循環小數。當發現重復的余數時,表示開始出現循環節,可以將循環部分括在括號內。這種方法可以快速確定循環節的起始位置和結束位置。

問題 3:你的算法的時間復雜度和空間復雜度是多少?

回答:模擬長除法方法的時間復雜度是 O(n),空間復雜度是 O(n),其中 n 是小數部分的長度。字符串操作方法的時間復雜度是 O(n),空間復雜度是 O(n)。

問題 4:在什么情況下會出現循環小數?

回答:當分子和分母的最大公約數不為1時,且分母有質因數2或5之外的其他質因數時,分數轉換為小數會出現循環小數。例如,2/3轉換為小數時,會出現循環小數0.(6)。

問題 5:你能解釋一下模擬長除法的方法嗎?

回答:模擬長除法的方法通過逐步計算小數部分,每一步記錄當前的余數位置。如果發現重復的余數,則表示開始出現循環節。將循環部分括在括號內,生成最終結果。

問題 6:如何處理分子或分母為負數的情況?

回答:首先判斷分子和分母的符號,通過異或運算確定結果的符號。然后將分子和分母轉換為正數,繼續進行后續計算。最后將符號添加到結果字符串的開頭。

問題 7:在代碼中如何處理分數的整數部分和小數部分?

回答:首先計算整數部分,將整數部分添加到結果字符串中。然后計算小數部分,通過模擬長除法或字符串操作的方法逐步計算,檢測循環節并構建最終結果。

問題 8:你能舉例說明在面試中如何回答優化問題嗎?

回答:在面試中,如果面試官問到如何優化算法,我會首先分析當前算法的瓶頸,如時間復雜度和空間復雜度,然后提出優化方案。例如,對于分數到小數問題,我會提到使用哈希表記錄余數的位置,以快速檢測循環節,并解釋其原理和優勢,最后提供代碼實現和復雜度分析。

問題 9:如何驗證代碼的正確性?

回答:通過多個測試案例驗證代碼的正確性,包括正常情況和邊界情況。例如,測試分數的整數部分和小數部分、前導零情況、循環小數情況等,確保代碼在各種情況下都能正確運行。

問題 10:你能解釋一下分數到小數轉換的重要性嗎?

回答:分數到小數的轉換在數學計算、科學研究和工程應用中非常重要。例如,精確表示和計算分數值,確保計算結果的準確性。分數到小數的轉換還用于金融和統計分析中,幫助人們更直觀地理解和比較數值大小。

總結

本文詳細解讀了力扣第166題“分數到小數”,通過模擬長除法和字符串操作兩種方法,高效地解決了這一問題,并提供了詳細的ASCII圖解和模擬面試問答。希望讀者通過本文的學習,能夠在力扣刷題的過程中更加得心應手。

參考資料

  • 《算法導論》—— Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • 力扣官方題解

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

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

相關文章

鋇錸技術BL205模塊在智能制造產線的靈活配置與優化

鋇錸技術的OPC UA耦合器BL205模塊在智能制造產線中的靈活配置與優化是當今工業領域中的一個關鍵議題。隨著工業4.0和數字化轉型的不斷推進&#xff0c;生產線的靈活性和智能化程度成為了企業追求的目標。在這一背景下&#xff0c;BL205模塊以其分布式、可插拔、結構緊湊、可編程…

【Python快速上手(三十三)】- Python operator 模塊

目錄 Python快速上手&#xff08;三十三&#xff09;- Python operator 模塊Python operator 模塊詳解1. 模塊簡介2. 算術運算符函數3. 比較運算符函數4. 位運算符函數5. 序列操作函數6. 方法調用函數7. 操作函數對象8. 實際應用案例9. 小結 Python快速上手&#xff08;三十三&…

Java基礎入門day57

day57 JSP、Servlet&#xff0c;Java bean和JDBC整合項目 index.jsp頁面 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <!DOCTYPE html> <html> <head><title>JSP - Hello World</title> …

CSS 媒體查詢 響應式開發

介紹 媒體查詢&#xff08;Media Queries&#xff09;是CSS3的技術&#xff0c;可以根據設備的特性&#xff08;如屏幕寬度、高度、方向等&#xff09;來應用不同的樣式規則。媒體查詢可以使網頁在不同設備上呈現不同的樣式&#xff0c;以實現響應式設計。 語法 media scree…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加載預訓練模型參數對不齊和收到意外參數報錯解決方案

使用mmdetection時遇到的問題比較多&#xff0c;首先要對自己要使用的預訓練模型有一定的了解&#xff0c;并且懂得使用各種分類模型時不同的模型不同任務執行階段需要參數上的對其。&#xff08;比如mask-rcnn和它的三個頭之間的參數&#xff09;。 首先&#xff0c;談談torc…

什么是聲明式事務管理?

聲明式事務管理是Spring提供的一種事務管理機制&#xff0c;它允許開發者通過聲明的方式&#xff0c;而不是通過編程的方式&#xff0c;來管理事務的邊界和行為。在聲明式事務管理中&#xff0c;你可以通過注解或XML配置來指定方法或類上的事務屬性和行為。 在Spring中&#x…

Spring Boot集成六大常用中間件,附集成源碼,親測有效

目錄 萬字論文&#xff0c;從0到1&#xff0c;只需1小時獲取途徑1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

JavaEE(入門)

JavaEE &#xff08;詳細注釋版&#xff09; 1. 入門基礎 1.1 JavaEE簡介 JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;是由Sun Microsystems推出的一套標準&#xff0c;現由Oracle維護。JavaEE平臺主要用于開發和運行企業級應用程序&#xff0c;具有高…

11 Goroutine-并發與并行、阻塞與非阻塞

并發 順序執行&#xff1a;按照事先計劃好的順序&#xff0c;執行完一個操作后&#xff0c;再執行下一個操作。 順序執行效率不高的原因&#xff1a; 每個操作由多個步驟組成&#xff0c;每個步驟所需要的時間長短不一&#xff0c;有些步驟可能相當耗時。顧客點菜需要時間&a…

VectorDBBench在windows的調試

VectorDBBench在windows的調試 VectorDBBench是一款向量數據庫基準測試工具&#xff0c;支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等&#xff0c;可以測試其QPS、時延、recall。 VectorDBBench是一款使用python編寫的…

輕松學EntityFramework Core--Entity Framework Core 簡介

一、什么是Entity Framework Core Entity Framework Core&#xff08;簡稱EF Core&#xff09;是一個現代的、跨平臺的、開源的ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;由微軟開發。它允許.NET開發者通過.NET對象與關系型數據庫進行交互&#xff0c;而無需編…

putty中的plink.exe功能和用法

plink對于自動化的執行命令和工作非常有好處。plink可以讓我們直接在命令行制定好命令&#xff0c;然后執行&#xff0c;完成后自動關閉session。 Plink: command-line connection utility Release 0.81 Usage: plink [options] [user]host [command]("host" can al…

2024年150道高頻Java面試題(七十四)

147. 如何在 MyBatis 中實現一對多和多對一的關系映射&#xff1f; 在 MyBatis 中實現一對多&#xff08;One-to-Many&#xff09;和多對一&#xff08;Many-to-One&#xff09;的關系映射&#xff0c;主要是通過 <resultMap> 元素中的 <collection> 和 <assoc…

深度學習模型在OCR中的可解釋性問題與提升探討

摘要&#xff1a; 隨著深度學習技術在光學字符識別&#xff08;OCR&#xff09;領域的廣泛應用&#xff0c;人們對深度學習模型的可解釋性問題日益關注。本文將探討OCR中深度學習模型的可解釋性概念及其作用&#xff0c;以及如何提高可解釋性&#xff0c;使其在實際應用中更可…

在Linux系統上使用Nginx的詳解指南

目錄 簡介 準備工作 安裝Nginx 通過包管理器安裝 源碼編譯安裝 Nginx基礎配置 主配置文件nginx.conf詳解 基本服務器塊配置 SSL/TLS配置 動靜分離 反向代理配置 負載均衡配置 常見問題及解決方法 結論 1. 簡介 Nginx是一款高性能HTTP和反向代理服務器&#xff…

上位機圖像處理和嵌入式模塊部署(f103 mcu唯一的id)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 對于stm32f103系列mcu來說,一般每一顆原廠的mcu,都會對應一個唯一的id。那這個id可以用來做什么用呢?個人認為,可以用來做激活使用。舉個例子,第一次mcu模塊使用的時候,一般可…

Java 零基礎入門學習(小白也能看懂!)

&#x1f4da;博客主頁&#xff1a;愛敲代碼的小楊. ?專欄&#xff1a;《Java SE語法》 | 《數據結構與算法》 | 《C生萬物》 |《MySQL探索之旅》 |《Web世界探險家》 ??感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;&#xff0c;您的三連就是我持續更…

第16篇:JTAG UART IP應用<三>

Q&#xff1a;如何通過HAL API函數庫訪問JTAG UART&#xff1f; A&#xff1a;Quartus硬件工程以及Platform Designer系統也和第一個Nios II工程--Hello_World的Quartus硬件工程一樣。 Nios II軟件工程對應的C程序調用HAL API函數&#xff0c;如open用于打開和創建文件&#…

前端最新面試題(ES6模塊篇)

目錄 1 ES5、ES6和ES2015有什么區別? 2 babel是什么,有什么作用? 3 let有什么用,有了var為什么還要用let? 4 舉一些ES6對String字符串類型做的常用升級優化? 5 舉一些ES6對Array數組類型做的常用升級優化 6 舉一些ES6對Number數字類型做的常用升級優化 7 舉一些ES…

前端基礎入門三大核心之JS篇:JavaScript,不只是咖啡因那么簡單!—— 進階案例集錦篇

前端基礎入門三大核心之JS篇&#xff1a;解鎖JavaScript的魔法密鑰—— 進階案例集錦 &#x1f9d9; 基礎概念與作用&#xff1a;JS&#xff0c;不僅僅是“腳本”&#x1f4da; 變量聲明的進化史 &#x1f50d; 多維度功能使用&#xff1a;函數、數組與對象&#x1f916; 函數&…