LeetCode(258.各位相加)的思路及解决过程
问题如下:
给一个非负整数 num,反复添加所有的数字,直到结果只有一个数字。
例如:
设定 num = 38,过程就像: 3 + 8 = 11, 1 + 1 = 2。 由于 2 只有1个数字,所以返回它。
进阶:
你可以不用任何的循环或者递归算法,在 O(1) 的时间内解决这个问题么?
初始的想法:
开始只看到了进阶,要求使用O(1)的时间复杂度,因此我想了一下,既然是int型变量,那么它的范围是-32768~32767,因此最高一共有5位数,所以O(1)算法可以直接使用五个int型变量存储起来然后相加,最多连续相加两次即可得到个位数,因此初始写的代码如下:
class Solution {
public:
int addDigits(int num) {
int a1,a2,a3,a4,a5,sum = 0;//将数据拆开后相加
a1 = num%10;
num /= 10;
a2 = num%10;
num /= 10;
a3 = num%10;
num /= 10;
a4 = num%10;
num /= 10;
a5 = num%10;
sum = a1+a2+a3+a4+a5;
a1 = sum%10;//此时最多还有两位数有实际意义,再相加一次
sum /= 10;
a2 = sum%10;
sum = a1+a2;
a1 = sum%10;//此时最多还有两位数有实际意义,再相加一次,必然得到个位数最终结果
sum /= 10;
a2 = sum%10;
sum = a1+a2;
return sum;
}
};
但是。。。。。。我还是Too Young Too Simple。。。

谁TM知道这个int竟然是超过五位数的啊!!!
分析错误:
于是乎我就查了一下资料。。。看看int究竟是怎么个一回事。。。。。
int型长度到底是几个字节?(http://blog.sina.com.cn/s/blog_865e6dd50102vmqr.html)
在一些没有操作系统的嵌入式计算机系统上,int的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义int字长:“比如你在64位机器上运行DOS16系统,那么所有for dos16的C/C++编译器中int都是16位的;在64位机器上运行win32系统,那么所有for win32的C/C++编译器中int都是32位的”。(CPU的“字长”是指其一条指令/一次运算可以处理的数据的最大宽度。
所以说int类型并不一定只有4位或者两位。。。。因此要考虑到数字特别大的情况。。。。。。。。
改正错误:
因此我还是用循环函数吧。。。。。。代码如下
class Solution {
public:
int addDigits(int num) {
int i,sum = 0;
while(1)
{
while(num != 0)
{
sum += num%10;
num /= 10;
}
if(sum >= 10)
{
num = sum;
sum = 0;
}
else
break;
}
return sum;
}
};
这次问题成功解决了。

问题:
那么究竟用什么方法才能达到O(1)的时间复杂度呢?这个问题在我详细的学习算法后再进行解答。
LeetCode(258.各位相加)的思路及解决过程的更多相关文章
- LeetCode 258. 各位相加(Add Digits)
258. 各位相加 258. Add Digits 题目描述 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. LeetCode258. Add Digits 示例: 输入: 3 ...
- Java实现 LeetCode 258 各位相加
258. 各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由 ...
- Leetcode -- 258 数位相加
258. Given a non-negative integer num, repeatedly add all its digits until the result has only one d ...
- Leetcode——258.各位相加【水题】
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所 ...
- leetcode 258. 各位相加 (python)
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以 ...
- LeetCode:字符串相加【415】
LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...
- 轮播图的3个常见bug,即处理bug思路及其解决办法
1,下载jquery.js文件,并且导入 2,在下面的img中写入可以用图片路径 <!-- 第一个bug: 刚打开页面时,按一下左键图片没切换,再按第二下时才切换图片. 第二个bug: Ctrl ...
- 启动Tomcat一闪而过——分析及解决过程
启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...
- 一次故障解决过程梳理:mysql varchar text timestamp
CHAR 类型的一个变体是 VARCHAR 类型,char(M),M是指字节长度,和varchar(M)一样 故障原因:mysql主键设置为int(9),但数据量已经大于int(9)的范围了 tips ...
随机推荐
- android之Notification通知
我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问题的. pac ...
- redis的安装和类型及基本命令
一.memcached和redis区别 1. redis 可以存储,memcached用来缓存, 2. 数据类型,memcached只有string:redis有string,链表,哈希结构,集合,有 ...
- 杂项-公司:摩根大通百科-un
ylbtech-杂项-公司:摩根大通百科 摩根大通集团(JPMorgan Chase & Co,NYSE:JPM:),2000年12月由J.P.摩根公司和大通-曼哈顿公司合并而成,是美国主要的 ...
- AngularJS:过滤器
ylbtech-AngularJS:过滤器 1.返回顶部 1. AngularJS 过滤器 过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤 ...
- MySQL 5.6/5.7 linux常见安装(tar,yum,script)
该文章总结一下MySQL的常见安装方式,以tar,yum,script 三种方式来演示: 一般的公司都会有自己统一的数据库安装规范和模板,在生产环境请按照自己的规范来安装和使用,这里只演示和测试,供需 ...
- Docker构建ssh镜像
FROM ubuntu MAINTAINER ggzone xxx@live.com ENV REFRESHED_AT 2015-10-21 RUN apt-get -qqy update & ...
- Mysql提权
获取最高用户root的密码 获取方式:数据库配置文件.端口破解口令.下载数据库文件获取等1.数据库配置文件config,conn,data,sql,include,common,inc等命名文件2.数 ...
- Listview使用安卓自带布局实现单选
安卓提供了一些自带的布局,使用非常简单.直接看代码吧. package com.example.linfeng.myapplication; import android.app.Activity; ...
- linux进行Java开发环境的部署
一.前言: 今天正式向linux开发进攻了,其中遇到一些问题简单的记录一下,为之后的再次部署提供方便. 二.linux的Java8安装的两种方法: 1.源安装很简单,一个命令搞定. sudo apt- ...
- centos6下的安装navicat premium
centos6下的安装navicat premium CentOS6下做开发的时候,数据库客户端是一个必须要有的工具,因为经常要和数据库打交道.由于数据库的类型多样,有MySQL.Oracle.Pos ...