273. Integer to English Words

本文介绍了一种将非负整数转换为其英文单词表示的方法,适用于小于2^31-1的输入。通过示例展示了从三位数到十位数的转换过程,并提供了详细的算法实现,包括处理小于1000的数字和使用1000作为分隔符的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.

Example 1:

Input: 123
Output: “One Hundred Twenty Three”

Example 2:

Input: 12345
Output: “Twelve Thousand Three Hundred Forty Five”

Example 3:

Input: 1234567
Output: “One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven”

Example 4:

Input: 1234567891
Output: “One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One”

Problem URL


Solution

给一个int,转化为string的文字的形式

Using a helper to process num < 1000, and use 1000 as a divide.

Code
class Solution {
    private final String[] LESS_20 = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
    private final String[] TENS = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
    private final String[] THOUSANDS = {"", "Thousand", "Million", "Billion"};
    public String numberToWords(int num) {
        if (num == 0){
            return "Zero";
        }
        int i = 0;
        String word = "";
        while (num > 0){
            if (num % 1000 != 0){      
                word = helper(num % 1000) + THOUSANDS[i] + " " + word;
            }
            num /= 1000;
            i++;
        }
        
        return word.trim();
        
    }
    
    private String helper(int num){
        if (num == 0){
            return "";
        }
        else if (num < 20){
            return LESS_20[num] + " ";
        }
        else if (num < 100){
            return TENS[num / 10] + " " + helper(num % 10);
        }
        else{
            return LESS_20[num / 100] + " Hundred " + helper(num % 100);
        }
    }
}

Time Complexity: unknow
Space Complexity: unknow


Review
import re import sqlite3 from collections import Counter from tkinter import * from tkinter import ttk, messagebox import tkinter.scrolledtext as scrolledtext from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import nltk import threading # 下载NLTK数据(第一次运行时需要) nltk.download('stopwords') nltk.download('punkt') class AcademicPaperManager: def __init__(self, root): self.root = root self.root.title("学术论文管理系统") self.root.geometry("1000x700") # 初始化数据库 self.init_db() # 创建界面 self.create_widgets() # 加载停用词 self.stop_words = set(stopwords.words('english')) def init_db(self): """初始化数据库""" self.conn = sqlite3.connect('papers.db') self.cursor = self.conn.cursor() # 创建表 self.cursor.execute(''' CREATE TABLE IF NOT EXISTS papers ( id INTEGER PRIMARY KEY, title TEXT, year INTEGER, journal TEXT, volume TEXT, number TEXT, pages TEXT, abstract TEXT, doi TEXT, issn TEXT, month TEXT ) ''') self.cursor.execute(''' CREATE TABLE IF NOT EXISTS authors ( id INTEGER PRIMARY KEY, name TEXT UNIQUE ) ''') self.cursor.execute(''' CREATE TABLE IF NOT EXISTS paper_author ( paper_id INTEGER, author_id INTEGER, PRIMARY KEY (paper_id, author_id), FOREIGN KEY (paper_id) REFERENCES papers(id), FOREIGN KEY (author_id) REFERENCES authors(id) ) ''') self.cursor.execute(''' CREATE TABLE IF NOT EXISTS keywords ( id INTEGER PRIMARY KEY, keyword TEXT UNIQUE ) ''') self.cursor.execute(''' CREATE TABLE IF NOT EXISTS paper_keyword ( paper_id INTEGER, keyword_id INTEGER, PRIMARY KEY (paper_id, keyword_id), FOREIGN KEY (paper_id) REFERENCES papers(id), FOREIGN KEY (keyword_id) REFERENCES keywords(id) ) ''') self.conn.commit() def create_widgets(self): """创建界面组件""" # 顶部框架 - 导入功能 top_frame = Frame(self.root) top_frame.pack(pady=10, fill=X) Label(top_frame, text="BibTeX文件路径:").grid(row=0, column=0, padx=5) self.file_path = Entry(top_frame, width=50) self.file_path.grid(row=0, column=1, padx=5) Button(top_frame, text="浏览", command=self.browse_file).grid(row=0, column=2, padx=5) Button(top_frame, text="导入数据", command=self.start_import).grid(row=0, column=3, padx=5) # 进度条和状态 self.progress = ttk.Progressbar(top_frame, orient=HORIZONTAL, length=200, mode='determinate') self.progress.grid(row=1, column=0, columnspan=4, pady=5, sticky='ew') self.status = Label(top_frame, text="就绪") self.status.grid(row=2, column=0, columnspan=4) # 中间框架 - 查询功能 middle_frame = Frame(self.root) middle_frame.pack(pady=10, fill=X) # 查询条件 Label(middle_frame, text="关键词:").grid(row=0, column=0, padx=5) self.keyword_entry = Entry(middle_frame, width=20) self.keyword_entry.grid(row=0, column=1, padx=5) Label(middle_frame, text="作者:").grid(row=0, column=2, padx=5) self.author_entry = Entry(middle_frame, width=20) self.author_entry.grid(row=0, column=3, padx=5) Label(middle_frame, text="年份:").grid(row=0, column=4, padx=5) self.year_entry = Entry(middle_frame, width=10) self.year_entry.grid(row=0, column=5, padx=5) Button(middle_frame, text="查询", command=self.search_papers).grid(row=0, column=6, padx=5) Button(middle_frame, text="查询合作关系", command=self.search_collaborators).grid(row=0, column=7, padx=5) Button(middle_frame, text="统计高频词", command=self.show_top_words).grid(row=0, column=8, padx=5) # 底部框架 - 结果显示 bottom_frame = Frame(self.root) bottom_frame.pack(pady=10, fill=BOTH, expand=True) # 结果列表 self.tree = ttk.Treeview(bottom_frame, columns=('ID', 'Title', 'Authors', 'Year', 'Journal'), show='headings') self.tree.heading('ID', text='ID') self.tree.heading('Title', text='标题') self.tree.heading('Authors', text='作者') self.tree.heading('Year', text='年份') self.tree.heading('Journal', text='期刊') self.tree.column('ID', width=50) self.tree.column('Title', width=300) self.tree.column('Authors', width=200) self.tree.column('Year', width=50) self.tree.column('Journal', width=150) self.tree.pack(side=LEFT, fill=BOTH, expand=True) # 添加滚动条 scrollbar = ttk.Scrollbar(bottom_frame, orient=VERTICAL, command=self.tree.yview) scrollbar.pack(side=RIGHT, fill=Y) self.tree.configure(yscrollcommand=scrollbar.set) # 详情面板 self.details = scrolledtext.ScrolledText(self.root, width=100, height=10) self.details.pack(pady=10, fill=BOTH, expand=False) # 绑定事件 self.tree.bind('<<TreeviewSelect>>', self.show_paper_details) def browse_file(self): """浏览文件""" from tkinter.filedialog import askopenfilename filepath = askopenfilename(filetypes=[("BibTeX files", "*.bib"), ("Text files", "*.txt"), ("All files", "*.*")]) if filepath: self.file_path.delete(0, END) self.file_path.insert(0, filepath) def start_import(self): """开始导入数据""" filepath = self.file_path.get() if not filepath: messagebox.showerror("错误", "请选择BibTeX文件") return # 清空进度条 self.progress['value'] = 0 self.status.config(text="正在导入...") # 直接在主线程中执行导入 self.import_data(filepath) def import_data(self, filepath): """导入数据到数据库""" try: with open(filepath, 'r', encoding='utf-8') as f: content = f.read() # 解析BibTeX文件 entries = self.parse_bibtex(content) total = len(entries) for i, entry in enumerate(entries): # 更新进度 progress = (i + 1) / total * 100 self.root.after(0, lambda p=progress: self.update_progress(p, f"正在导入 {i+1}/{total}")) # 插入论文 paper_id = self.insert_paper(entry) # 插入作者 if 'author' in entry: authors = self.parse_authors(entry['author']) for author in authors: author_id = self.insert_author(author) self.insert_paper_author(paper_id, author_id) # 插入关键词 if 'keywords' in entry: keywords = [kw.strip() for kw in entry['keywords'].split(';')] for keyword in keywords: keyword_id = self.insert_keyword(keyword) self.insert_paper_keyword(paper_id, keyword_id) self.root.after(0, lambda: self.update_progress(100, f"导入完成,共导入 {total} 篇论文")) self.root.after(0, lambda: messagebox.showinfo("成功", f"成功导入 {total} 篇论文")) except Exception as e: self.root.after(0, lambda: messagebox.showerror("错误", f"导入失败: {str(e)}")) self.root.after(0, lambda: self.update_progress(0, "导入失败")) def update_progress(self, value, text): """更新进度条和状态""" self.progress['value'] = value self.status.config(text=text) self.root.update() def parse_bibtex(self, content): """解析BibTeX内容""" entries = [] pattern = re.compile(r'@(\w+)\s*\{([^,]+),\s*([^@]*)\}', re.DOTALL) for match in pattern.finditer(content): entry_type = match.group(1) entry_key = match.group(2) entry_fields = match.group(3) if entry_type.lower() != 'article': continue entry = {'key': entry_key} field_pattern = re.compile(r'(\w+)\s*=\s*\{([^}]*)\}', re.DOTALL) for field_match in field_pattern.finditer(entry_fields): field_name = field_match.group(1).lower() field_value = field_match.group(2).strip() entry[field_name] = field_value entries.append(entry) return entries def parse_authors(self, author_str): """解析作者字符串""" # 处理类似 "Chen, Zheyi and Liang, Jie and Yu, Zhengxin" 的格式 authors = [] for author in author_str.split(' and '): author = author.strip() if ',' in author: last, first = author.split(',', 1) author = f"{first.strip()} {last.strip()}" authors.append(author) return authors def insert_paper(self, entry): """插入论文到数据库""" self.cursor.execute(''' INSERT INTO papers (title, year, journal, volume, number, pages, abstract, doi, issn, month) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( entry.get('title', ''), int(entry['year']) if 'year' in entry else None, entry.get('journal', ''), entry.get('volume', ''), entry.get('number', ''), entry.get('pages', ''), entry.get('abstract', ''), entry.get('doi', ''), entry.get('issn', ''), entry.get('month', '') )) self.conn.commit() return self.cursor.lastrowid def insert_author(self, author_name): """插入作者到数据库""" self.cursor.execute(''' INSERT OR IGNORE INTO authors (name) VALUES (?) ''', (author_name,)) self.conn.commit() self.cursor.execute('SELECT id FROM authors WHERE name = ?', (author_name,)) return self.cursor.fetchone()[0] def insert_paper_author(self, paper_id, author_id): """插入论文-作者关系到数据库""" self.cursor.execute(''' INSERT OR IGNORE INTO paper_author (paper_id, author_id) VALUES (?, ?) ''', (paper_id, author_id)) self.conn.commit() def insert_keyword(self, keyword): """插入关键词到数据库""" self.cursor.execute(''' INSERT OR IGNORE INTO keywords (keyword) VALUES (?) ''', (keyword,)) self.conn.commit() self.cursor.execute('SELECT id FROM keywords WHERE keyword = ?', (keyword,)) return self.cursor.fetchone()[0] def insert_paper_keyword(self, paper_id, keyword_id): """插入论文-关键词关系到数据库""" self.cursor.execute(''' INSERT OR IGNORE INTO paper_keyword (paper_id, keyword_id) VALUES (?, ?) ''', (paper_id, keyword_id)) self.conn.commit() def search_papers(self): """查询论文""" keyword = self.keyword_entry.get().strip() author = self.author_entry.get().strip() year = self.year_entry.get().strip() query = ''' SELECT p.id, p.title, GROUP_CONCAT(a.name, ', '), p.year, p.journal FROM papers p JOIN paper_author pa ON p.id = pa.paper_id JOIN authors a ON pa.author_id = a.id ''' conditions = [] params = [] if keyword: query += ''' JOIN paper_keyword pk ON p.id = pk.paper_id JOIN keywords k ON pk.keyword_id = k.id ''' conditions.append("k.keyword LIKE ?") params.append(f"%{keyword}%") if author: conditions.append("a.name LIKE ?") params.append(f"%{author}%") if year: conditions.append("p.year = ?") params.append(year) if conditions: query += " WHERE " + " AND ".join(conditions) query += " GROUP BY p.id" self.cursor.execute(query, params) papers = self.cursor.fetchall() # 清空树视图 for item in self.tree.get_children(): self.tree.delete(item) # 添加结果 for paper in papers: self.tree.insert('', 'end', values=paper) self.status.config(text=f"找到 {len(papers)} 篇论文") def search_collaborators(self): """查询合作关系""" author_name = self.author_entry.get().strip() if not author_name: messagebox.showwarning("警告", "请输入作者名") return # 查找作者ID self.cursor.execute('SELECT id FROM authors WHERE name LIKE ?', (f"%{author_name}%",)) authors = self.cursor.fetchall() if not authors: messagebox.showinfo("提示", "未找到该作者") return # 查询合作关系 collaborators = set() for author_id in authors: self.cursor.execute(''' SELECT a.name FROM authors a JOIN paper_author pa ON a.id = pa.author_id WHERE pa.paper_id IN ( SELECT paper_id FROM paper_author WHERE author_id = ? ) AND a.id != ? ''', (author_id[0], author_id[0])) for collab in self.cursor.fetchall(): collaborators.add(collab[0]) # 显示结果 if collaborators: result = f"作者 {author_name} 的合作者:\n\n" + "\n".join(collaborators) self.details.delete(1.0, END) self.details.insert(END, result) self.status.config(text=f"找到 {len(collaborators)} 位合作者") else: messagebox.showinfo("提示", "未找到合作者") def show_top_words(self): """显示摘要高频词""" self.cursor.execute('SELECT abstract FROM papers') abstracts = [row[0] for row in self.cursor.fetchall() if row[0]] if not abstracts: messagebox.showinfo("提示", "没有可用的摘要数据") return # 分词并统计 words = [] for abstract in abstracts: tokens = word_tokenize(abstract.lower()) words.extend([word for word in tokens if word.isalpha() and word not in self.stop_words]) word_counts = Counter(words) top_words = word_counts.most_common(20) # 显示结果 result = "摘要高频词Top 20:\n\n" for word, count in top_words: result += f"{word}: {count}\n" self.details.delete(1.0, END) self.details.insert(END, result) self.status.config(text="已统计摘要高频词") def show_paper_details(self, event): """显示论文详情""" selected = self.tree.focus() if not selected: return paper_id = self.tree.item(selected, 'values')[0] # 获取论文详情 self.cursor.execute('SELECT * FROM papers WHERE id = ?', (paper_id,)) paper = self.cursor.fetchone() # 获取作者 self.cursor.execute(''' SELECT a.name FROM authors a JOIN paper_author pa ON a.id = pa.author_id WHERE pa.paper_id = ? ''', (paper_id,)) authors = ", ".join([row[0] for row in self.cursor.fetchall()]) # 获取关键词 self.cursor.execute(''' SELECT k.keyword FROM keywords k JOIN paper_keyword pk ON k.id = pk.keyword_id WHERE pk.paper_id = ? ''', (paper_id,)) keywords = ", ".join([row[0] for row in self.cursor.fetchall()]) # 显示详情 details = f""" 标题: {paper[1]} 作者: {authors} 年份: {paper[2]} 期刊: {paper[3]} 卷: {paper[4]} 期: {paper[5]} 页: {paper[6]} DOI: {paper[8]} ISSN: {paper[9]} 月份: {paper[10]} 关键词: {keywords} 摘要: {paper[7]} """ self.details.delete(1.0, END) self.details.insert(END, details) if __name__ == "__main__": root = Tk() app = AcademicPaperManager(root) root.mainloop() 详细解析此段代码
最新发布
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值