LeetCode算法 IntegertoEnglishWords的解题方法
说明:本人能力有限,部分算法效率较差,各位如有好的思路,请留言回复。
Integer to English Words:
(资料图片仅供参考)
解题思路:由于最大输入值不可能大于231- 1.即2147483647,第十位:Billion;第七位:Million;第四位:Thousand;第一位:个位。由此可能观察到,将输入值分成四个小组,每三个一组,从低到高依次输入四个小组中。然分别对每个小组中处理,分别百位,十位,个位。
Java实现:
publicclass Solution {
public String numberToWords(int num) {
if(num==0) return "Zero";
int[] grp=new int[4];
String[] strNum=new String[4];
strNum[0]="";
strNum[1]="";
strNum[2]="";
strNum[3]="";
int i=0;
while(num!=0){
int mod=num%1000;
grp[i++]=mod;
num=num/1000;
}
for(int j=i;j<GRP.LENGTH;J++)< strong="">
grp[j]=0;
for(int k=0;k<GRP.LENGTH;K++){
int third=grp[k]/100;
if(third!=0){
switch(third){
case1:strNum[k]+="One ";break;
case 2:strNum[k]+="Two";break;
case 3:strNum[k]+="Three";break;
case 4:strNum[k]+="Four";break;
case 5:strNum[k]+="Five";break;
case 6:strNum[k]+="Six";break;
case 7:strNum[k]+="Seven";break;
case 8:strNum[k]+="Eight";break;
case 9:strNum[k]+="Nine";break;
}
strNum[k]+="Hundred ";
}
grp[k]=grp[k]%100;
int second=grp[k]/10;
if(second!=0){
switch(second){
case 1:
switch(grp[k]){
case10:strNum[k]+="Ten ";break;
case11:strNum[k]+="Eleven ";break;
case12:strNum[k]+="Twelve ";break;
case13:strNum[k]+="Thirteen ";break;
case14:strNum[k]+="Fourteen ";break;
case15:strNum[k]+="Fifteen ";break;
case16:strNum[k]+="Sixteen ";break;
case17:strNum[k]+="Seventeen ";break;
case18:strNum[k]+="Eighteen ";break;
case19:strNum[k]+="Nineteen ";break;
}
break;
case 2:strNum[k]+="Twenty ";break;
case 3:strNum[k]+="Thirty ";break;
case 4:strNum[k]+="Forty ";break;
case 5:strNum[k]+="Fifty ";break;
case 6:strNum[k]+="Sixty ";break;
case 7:strNum[k]+="Seventy ";break;
case 8:strNum[k]+="Eighty ";break;
case 9:strNum[k]+="Ninety ";break;
}
}
if(second!=1){
grp[k]=grp[k]%10;
int first=grp[k];
if(first!=0){
switch(first){
case1:strNum[k]+="One ";break;
case 2:strNum[k]+="Two";break;
case 3:strNum[k]+="Three";break;
case 4:strNum[k]+="Four";break;
case 5:strNum[k]+="Five";break;
case 6:strNum[k]+="Six";break;
case 7:strNum[k]+="Seven";break;
case 8:strNum[k]+="Eight";break;
case 9:strNum[k]+="Nine";break;
}
}
}
if(strNum[k].length()>0){
switch(k){
case 1:strNum[k]+="Thousand";break;
case 2:strNum[k]+="Million";break;
case 3:strNum[k]+="Billion";break;
}
}
}
String res=strNum[3]+strNum[2]+strNum[1]+strNum[0];
return res.substring(0,res.length()-1);
}
}
url:https://leetcode.com/problems/integer-to-english-words/
2、Missing Number
解题思路:利用输入漏掉数字的数组所有数字之和和完全数组之和,做减法,即差值即是所要的。
Java代码实现:
public class Solution {
public intmissingNumber(int[] nums) {
int sum1=0;
int sum=0;
for(inti=0;i<NUMS.LENGTH+1;I++)< h3="">
sum1=sum1+i;
for(inti=0;i<NUMS.LENGTH;I++)< h3="">
sum=sum+nums[i];
return sum1-sum;
}
}
url:https://leetcode.com/problems/missing-number/
3,Ugly Number
解题思路:分别让输入值给2、3、5做除法,直至不存在上述数字的倍数为止。
Java代码实现:
public class Solution {
public booleanisUgly(int num) {
if(num==0) returnfalse;
while(num%2==0)num=num/2;
while(num%3==0)num=num/3;
while(num%5==0)num=num/5;
if(num==1) returntrue;
else return false;
}
}
url:https://leetcode.com/problems/ugly-number/
4、SingleNumber III
解题思路:该题利用一个集合存储遍历的数字,如何初始该集合中没有则加入,有的话则删除,最后集合里面的数字,即是所要求的。
Java代码实现:
public class Solution {
public int[]singleNumber(int[] nums) {
Set set=newHashSet();
for(inti=0;i<NUMS.LENGTH;I++){
if(!set.contains(nums[i])) set.add(nums[i]);
else set.remove(nums[i]);
}
int [] re=newint[set.size()];
Iteratorit=set.iterator();
int i=0;
while(it.hasNext()){
re[i++]=it.next();
}
//System.out.print(re);
return re;
}
}
url:https://leetcode.com/problems/single-number-iii/
5、AddDigits
解题思路:传统方法,按位相加,循环,直至只有一位为止。
Java代码实现:
public class Solution {
public intaddDigits(int num) {
int sum=0;
//System.out.println(num);
while(num/10>0){
StringstrNum=String.valueOf(num);
//System.out.println(strNum.length());
for(inti=0;i<STRNUM.LENGTH();I++){
sum+=Integer.valueOf(strNum.charAt(i))-48;
//System.out.println(sum);
}
System.out.println(sum);
num=sum;
sum=0;
}
sum=num;
return sum;
}
}
url:https://leetcode.com/submissions/detail/37775675/
6、ValidAnagram
解题思路:该题意思即是两个字符串是否具有相同的字符组成的串,首先记录第一个字符串出现的字符及其个数,然后与第二个字符串想比较。(另一个思路:将两个字符串分别排序,不过耗时。)
Java代码实现:
public class Solution {
public booleanisAnagram(String s, String t) {
if(s.length()!=t.length()) return false;
Mapmap =new HashMap();
for(inti=0;i<S.LENGTH();I++){
String str=String.valueOf(s.charAt(i));
if(map.containsKey(str)) map.put(str,map.get(str)+1);
else map.put(str, 1);
}
for(int i=0;i<T.LENGTH();I++){
String str=String.valueOf(t.charAt(i));
if(map.containsKey(str)) {
map.put(str, map.get(str)-1);
if(map.get(str)==0)map.remove(str);
}
else map.put(str, 1);
}
if(map.isEmpty())return true;
else return false;
}
}
url:https://leetcode.com/problems/valid-anagram/
7、DeleteNode in a Linked List
解题思路:指定删除任一节点,因无头节点指针,实际删除节点即是删除节点的值,所以可以将要删除节点和后继节点的值替换,删除后继节点即可。
Java代码实现:
/**
* Definition forsingly-linked list.
* struct ListNode {
*int val;
*struct ListNode *next;
* };
*/
void deleteNode(struct ListNode* node) {
struct ListNode *p,*q;
p=q=node;
q=p->next;
p->val=q->val;
p->next=q->next;
free(q);
}
url:https://leetcode.com/submissions/detail/37866400/
8、Numberof Digit One
解题思路:0-9中1的个数为1个,而X99..9的1的个数可以通过公式计算:即Math.pow(10, digit-1)+(10-(9-highestDigit))*Math.pow(10,digit-2)*(digit-1);比如8999:10^3+9*10^2*3。由此可以将输入数字分解,比如9548=9000+548=9000+500+48=9000+500+40+8,如此分布计算即可。
Java代码:
public class Solution {
public intcountDigitOne(int n) {
int count=0;
while(n>0){
if(n/10==0) {
count++;
return count;//大于1的个位数只有一个1,返回
}
intdigit=0;//存储数字位数
int num=n;
while(num/10>0){
digit++;
num=num/10; //num最高位数字
}
digit++;
int highestDigit=num;//最高位数字
num=(int) (num*(Math.pow(10, digit-1)))-1;
if(highestDigit==1) {//1为最高位时,-1数字位数将会发生改变
count++;
count+=n-(num+1);
highestDigit=9;
digit--;
}
else{
highestDigit--;
}
count+=Math.pow(10,digit-1)+(10-(9-highestDigit))*Math.pow(10, digit-2)*(digit-1);//如8999计算1的公式
n=n-(num+1);
}
return count;
}
}
url:https://leetcode.com/submissions/detail/37894024/
9、ImplementQueue using Stacks
解题思路:采用两个栈,实现队列,一个用于进栈S1,一个用于出栈和取头元素S2。进栈时必须将S2中元素全部加入S1中,出栈时必须将S1中的元素加入S2中,才可以保证先进先出。判断为空时,S1,S2均为空。
Java代码实现:
class MyQueue {
private Stack stack1;
private Stack stack2;
MyQueue(){
stack1=newStack();
stack2=newStack();
}
// Push element x tothe back of queue.
public void push(intx) {
if(stack2.isEmpty()) stack1.push(x);
else {
while(!stack2.isEmpty()){
stack1.push(stack2.peek());
stack2.pop();
}
stack1.push(x);
}
}
// Removes the elementfrom in front of queue.
public void pop() {
if(stack1.isEmpty()) {
if(!stack2.isEmpty())
stack2.pop();
}
else {
while(!stack1.isEmpty()){
stack2.push(stack1.peek());
stack1.pop();
}
stack2.pop();
}
}
// Get the frontelement.
public int peek() {
if(stack1.isEmpty()) {
if(!stack2.isEmpty())
return (int) stack2.peek();
return -1;
}
else {
while(!stack1.isEmpty()){
stack2.push(stack1.peek());
stack1.pop();
}
return (int) stack2.peek();
}
}
// Return whether thequeue is empty.
public boolean empty(){
if(stack1.isEmpty()&&stack2.isEmpty())return true;
else return false;
}
}
url:https://leetcode.com/submissions/detail/37897765/
10、Power of Two
解题思路:如果一个数是否是2的次方,即如果其对应的二进制数1的个数如果超过1,不是的2的次方,反之才是。
Java代码实现:
public class Solution {
public booleanisPowerOfTwo(int n) {
int count=0;
if(n==1) return true;
if(n<=0) return false;
while(n>0){
int mod=n%2;
if(mod==1) count++;
if(count>1) return false;
n=n/2;
}
return true;
}
}
url:https://leetcode.com/problems/power-of-two/
11、Kth Smallest Element in aBST
解题思路:按树的中序遍历的方式,利用栈实现,第k个出栈的节点即是所求的。
Java代码实现:
/**
* Definition for a binarytree node.
* public class TreeNode {
*int val;
*TreeNode left;
*TreeNode right;
*TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public intkthSmallest(TreeNode root, int k) {
TreeNode p=newTreeNode(0);
p=root;
Stack sk=newStack();
sk.push(p);
while(p.left!=null){
sk.push(p.left);
p=p.left;
}
int i=0;
while(!sk.isEmpty()){
TreeNode q=newTreeNode(0);
q=(TreeNode)sk.pop();
i++;
if(i==k)return q.val;
if(q.right!=null) {
p=q.right;
sk.push(p);
while(p.left!=null){
sk.push(p.left);
p=p.left;
}
}
}
return 0;
}
}
url:https://leetcode.com/submissions/detail/38221838/
12、Invert Binary Tree
解题思路:利用中序遍历的方式,依次交换所遍历节点的左右子树。
Java代码实现:
/**
* Definition for a binarytree node.
* public class TreeNode {
*int val;
*TreeNode left;
*TreeNode right;
*TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNodeinvertTree(TreeNode root) {
if(root==null)return root;
Stack stack=newStack();
TreeNode p=newTreeNode(0);
stack.push(root);
p=root;
while(p.left!=null){
p=p.left;
stack.push(p);
}
while(!stack.isEmpty()){
TreeNodeq=(TreeNode)stack.pop();
TreeNodetemp=new TreeNode(0);;
temp=q.left;
q.left=q.right;
q.right=temp;
while(q.left!=null){
stack.push(q.left);
q=q.left;
}
}
return root;
}
}
url:https://leetcode.com/problems/invert-binary-tree/
13、Number of 1 Bits
解题思路:32位有符号整数的表示范围:-2147483648—2147483647。32位无符号整数的表示范围:0—2147483647+2147483648。如果输入的无符号数大于2147483647,则会显示成负数,所以当输入数字小于0时,只需加上2147483647+1,之后按照整数求1的个数,此时需要将1的个数加1.
Java代码实现:
public class Solution {
// you need to treat nas an unsigned value
public inthammingWeight(int n) {
int count=0;
if(n==0) return 0;
if(n<0) {
System.out.print(n);
n+=2147483647+1;
System.out.print(n);
count++;
}
while(n!=0){
int mod=n%2;
if(mod==1)count++;
n=n/2;
}
return count;
}
}
url:https://leetcode.com/problems/number-of-1-bits/
14、Reverse Bits
解题思路:该题与上题类似,如果是负数首先转化成正数(+ 2147483647+1),再处理,然后变成2进制数(如果是负数最高位是1),翻转2进制数,变成十进制数,翻转后如果最后位是1,在十进制数基础上加上2147483647+1。
Java代码实现:
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
String str="";
if(n==0) return 0;
if(n==-2147483648) return 1;
System.out.println(n);
int m=n;
if(n<0) {
n+=2147483647+1;
//str+="1";
}System.out.println(n);
while(n!=0){
int mod=n%2;
if(mod==1) str="1"+str;
else str="0"+str;
n=n/2;
}
String revString="";
for(int j=str.length();j<32;j++){
str="0"+str;
}
if(m<0)str="1"+str.substring(1,str.length());
for(int i=0;i<STR.LENGTH();I++){
revString=str.charAt(i)+revString;
}
int num=0;
for(inti=revString.length()-1;i>0;i--){
num+=(Integer.valueOf(revString.charAt(i))-48)*(int)Math.pow(2,revString.length()-1-i);
}
if(revString.charAt(0)=="1") {
return2147483647+1+num;
}
return num;
}
}
url:https://leetcode.com/problems/reverse-bits/
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
相关推荐:
最新新闻:
- 新一代office不支持xpsp3的操作系统 XPsp2安装office2010全过程
- css编写红色星号 垂直居中显示更美观
- 当前资讯!酷我音乐盒V5.2.1版本更新 全新乐库火热上线
- 前端页面的截取:MARK下一、引入头部二:全球新资讯
- 快看:如何申请CSDN博客?如何开通博客?
- 历史上的船到底有多厉害?蒸汽船的发展
- 全球速讯:不锈钢冷轧钢带外包装上的标签 你了解多少?
- 字幕助手电脑版:专业实用的视频字幕制作软件
- 速看:电梯安全知识——电梯关门的注意事项
- 焦点报道:HTC G14怎么刷MIUI?HTCG14刷MIUI教程
- 【商户管理】数字签名安全检测系统-Md5
- 什么是邮箱地址?邮箱系列软件最新版本下载_全球球精选
- 友信达手机多少钱?友信达手机报价大全-视焦点讯
- gps电子狗怎样升级?gps电子狗方法详解
- 好电影有哪些推荐?《追风筝的人》(The Kite Runner)
- 索尼xperia z刷flyme4.0步骤是什么?索尼l36h刷flyme4教程
- 中小企业如何开源节流?RPA:经济下行增效降本的良方
- 天天微资讯!诺基亚7500硬格如何操作?诺基亚7500硬格操作的介绍
- 世界微头条丨青橙m3如何刷机?青橙m3刷机教程
- 前端ol是啥意思是什么?前端开发基础入门--HTML
- 松下官宣:停止生产蓝光刻录碟 此前已生产3.3亿片!:世界热门
- 续航1200公里的铝离子电池 明年年底实现量产
- 世界热消息:不干胶印刷机价格怎么样?不干胶印刷机报价详情
- 【案例分享】降维案例探究
- word07目录如何生成?word07目录右侧页码怎样对齐?
- 环球最资讯丨第一中标获选人!北京地铁12号线电梯供货及安装中标结果公示
- 手机套子品牌哪款好?手机套子品牌推荐
- 开机要按f1怎么解决?开机启动项怎么设置?
- 世界今亮点!无线信号放大模式(Client+AP)怎么设置?设置步骤
- 环球快消息!联通无限流量卡套餐资费多少?联通无限流量卡套餐资费
- 什么是数据库系统?数据库系统有什么特点?
- 金鹏手机报价及推荐:金鹏a0001、668、5808 -全球通讯
- 世界最新:【turtle库】Python画图源码
- 诊断卡代码是什么意思?电脑主板故障诊断卡代码大全
- 石油是什么?油气地质储量及其分级:实时焦点
- 搜狐视频怎么看不了?如何下载搜狐网站里的视频?
- 【热闻】4g手机可以用3g卡吗?4g手机和3g手机区别
- 怎么看手机是否支持java?javax.lcdui.Display开发程序
- 全球热讯:【软件设计】XX模块详细设计说明书
- skype无法登录怎么解决?skype无法登录的操作方法
- Request、Form、Query、params的使用方法
- dnf怎么上不去了是什么原因?电脑登不上dnf的解决方法
- 每日快报!Typora1.0正式版开始收费!价格不算便宜
- 怎么把内存分给显卡?怎么看电脑内存显卡?
- 微头条丨魅族mx手机壳的价格和使用方法介绍 魅族mx手机壳的使用方法
- 一般试卷的纸张大小是多少?试卷标准字体大小是多少?|每日播报
- 天天观热点:不同型号的亿和源手机 报价多少钱?
- 【消元法】二元一次方程组怎么解?-全球快看
- wupdmgr.exe文件是什么?wupdmgr.exe文件信息介绍
- 当前视点!怎么登陆163邮箱?登陆163邮箱教程
- 诊断卡代码是什么意思?电脑主板故障诊断卡代码大全
- 搜狐视频怎么看不了?如何下载搜狐网站里的视频?
- skype无法登录怎么解决?skype无法登录的操作方法
- dnf怎么上不去了是什么原因?电脑登不上dnf的解决方法
- 怎么把内存分给显卡?怎么看电脑内存显卡?
- wupdmgr.exe文件是什么?wupdmgr.exe文件信息介绍
- 电话在线怎么激活win8.1?电话激活win8.1的具体方法
- 电脑任务栏没有声音图标是怎么回事?电脑任务栏没有声音图标解决方法
- DX11安装路径是什么?DX11安装路径位置
- 如何安装12306根证书?安装12306根证书的操作教程
- 手机如何进行彩信设置?已中国移动为例详解设置方法
- 诺顿磁盘医生是什么软件?诺顿磁盘医生使用方法介绍
- xp桌面美化怎么操作?电脑桌面美化软件哪个好用?
- 微信夜间模式是什么意思?手机如何切换夜间模式?
- win10第三方软件模糊是什么原因?win10第三方软件模糊解决方法
- 如何关闭445端口的网络访问权限?两种详细关闭445端口的方法
- 登录百度云提示错误1550010是什么情况?百度云提示错误解决方法
- 苹果App Store打不开怎么办?苹果App Store打不开解决方案
- 《怪奇物语》第五季5月开拍!预计2024年播出 -环球消息
- 不是云南也不是海南 四川春节接待游客人数全国第一
- 环球快消息!饭制《艾尔登法环》DLC预告片:PPT播片有内味儿了!
- 手绘风游戏《赎罪:世界树之心》 现已在Steam发售
- FPS《量子误差》发布新预告 游戏几乎接近完成_当前快讯
- 《假面骑士Outsiders》ep.2新预告 4月上线发布
- 机械硬盘永不为奴!希捷24TB和22 TB硬盘上半年推出,30TB和50TB硬盘Q3推出