问题如下:

给一个非负整数 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.各位相加)的思路及解决过程的更多相关文章

  1. LeetCode 258. 各位相加(Add Digits)

    258. 各位相加 258. Add Digits 题目描述 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. LeetCode258. Add Digits 示例: 输入: 3 ...

  2. Java实现 LeetCode 258 各位相加

    258. 各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由 ...

  3. Leetcode -- 258 数位相加

    258. Given a non-negative integer num, repeatedly add all its digits until the result has only one d ...

  4. Leetcode——258.各位相加【水题】

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所 ...

  5. leetcode 258. 各位相加 (python)

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以 ...

  6. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  7. 轮播图的3个常见bug,即处理bug思路及其解决办法

    1,下载jquery.js文件,并且导入 2,在下面的img中写入可以用图片路径 <!-- 第一个bug: 刚打开页面时,按一下左键图片没切换,再按第二下时才切换图片. 第二个bug: Ctrl ...

  8. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  9. 一次故障解决过程梳理:mysql varchar text timestamp

    CHAR 类型的一个变体是 VARCHAR 类型,char(M),M是指字节长度,和varchar(M)一样 故障原因:mysql主键设置为int(9),但数据量已经大于int(9)的范围了 tips ...

随机推荐

  1. switch控件的使用

    java中: public class MainActivity extends Activity implements OnCheckedChangeListener{ private Switch ...

  2. mongodb配置和基本操作

    MongoDB3.0新特性WiredTigerMMAPv1可插拔引擎API基于web的可视化管理工具 查看版本号mongod --version启动数据库 mongod --dbpath $dbpat ...

  3. POJ2142(扩展欧几里得)

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5991   Accepted: 2605 Descr ...

  4. PhysicalDrive

    由于"\"是C/C+中转义符, "\\\\.\\"就相当于\\.\ 在Windows中 \\.\ 前缀用于标识设备,其中的"."表示本地计算 ...

  5. VM 修改 virtualHW.version

    1.修改BT5R3-GNOME-VM-32.vmdk文件 将encoding="windows-1252"修改为encoding="GBK" 将ddb.virt ...

  6. AngularJS:template2

    ylbtech-AngularJS: 1.返回顶部 1.   2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1.   2.  6.返回顶部   作者:ylbtech出处:h ...

  7. [PHP] - Laravel - CSRF token禁用方法与排除验证csrf_token的url设置

    laravel5.1排除验证csrf_token的url设置 <?php namespace App\Http\Middleware; use Illuminate\Foundation\Htt ...

  8. Xml xpath samples

    Xml: <?xml version="1.0" encoding="utf-8" ?> <Orders xmlns="http:/ ...

  9. numpy的一些用法

    安装numpy windows安装pip即可,具体方法参考pip官网 http://pip-cn.readthedocs.io/en/latest/installing.html 安装方法:pip i ...

  10. 14-EasyNetQ之用Future Publish发布预定中事件

    很多商业流程需要事件在未来的时间按照预定时间发布.例如,在初次与客户接触后,可以在未来某个时间去电话回访客户.EasyNetQ可以用它的Future Publish功能帮你实现这个功能.举例:这里我们 ...