各位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入:
输出:
解释: 各位相加的过程为: + = , + = 。 由于 是一位数,所以返回 。

进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

题目地址 https://leetcode-cn.com/problems/add-digits/

代码模板

public class Solution {
public int AddDigits(int num) { }
}

测试数据

输入
输出 输入
输出 输入
输出 输入
输出 输入
输出

笔者的方法:

使用了while循环,除一次计算一次,原始数和各位数和同时变化。时间在70ms内。

        public static int Csum(int num)
{
if (num < ) //小于10的数直接返回
return num;
int shi = ; //记录个位数相加
while (num > )
{
if (num >= )
{
shi += num % ;
num = num / ;
}
else if (num < )
{
shi += num;
num = num / ;
} if (shi >= ) shi = shi % + shi / ;    //超过10的个位数重新变化
}
return shi;
}

方法二  弃九验算法

同样在 60-70ms

public class Solution {
public int AddDigits(int num) {
if(num==)
return ;
if(num%==)
return ;
return num%;
}
}

整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0

题目地址 https://leetcode-cn.com/problems/reverse-integer/

代码模板

public class Solution {
public int Reverse(int x) { }
}

笔者方法 68ms左右

   public class Solution
{
public int Reverse(int x)
{ int num = ;
while (x != )
{
int i = x % ;
x = x / ;
//C# int32 范围 [-2147483647~2147483647]
if (num > int.MaxValue / )
return ;
if (num < int.MinValue / )
return ; num = num * + i;
}
return num;
}
}

回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

题目地址:https://leetcode-cn.com/problems/palindrome-number

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

代码模板

public class Solution {
public bool IsPalindrome(int x) { }
}

笔者的代码

运行时间在120ms左右,笔者的思路是:如果一个数字的反序还是等于这个数,那么这个数就是回文数。

以下代码无法解决反序后可能溢出,可以利用上一题的代码进行溢出检查。

当然,一个int类型的数,如果是回文,那么他的反序肯定不会溢出,反之其反序发生溢出则肯定不是回文数。

    public class Solution
{
public bool IsPalindrome(int x)
{
if (x < ) return false;
int xx = x;
int num = ; //x的反序
while (xx != )    //求反序
{
int i = xx % ;
xx = xx / ;
num = num * + i;
}
if (x == num) //如果x的反序num==x,那么这个数字是回文数
return true; else
return false; }
}

加try-catch,耗时增加 10~20ms

            try {
while (xx != )
{
int i = xx % ;
xx = xx / ;
num = num * + i;
}
}
catch
{
return false;
}

官方这道题给出了示例代码,耗时120ms左右,思路是只反序一半,反序后的原始数、反序一半的数进行比较,也就不用检查溢出。

public class Solution {
public bool IsPalindrome(int x) {
// 特殊情况:
// 如上所述,当 x < 0 时,x 不是回文数。
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if(x < || (x % == && x != )) {
return false;
} int revertedNumber = ;
while(x > revertedNumber) {
revertedNumber = revertedNumber * + x % ;
x /= ;
} // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber/;
}
}

别人用字符串方式进行判断(虽然题目说不能用string),耗时150-180ms,不太稳定

    public class Solution
{
public bool IsPalindrome(int x)
{
string str = x.ToString();
for (int i = ; i < str.Length / ; ++i)
{
if (str[i] != str[str.Length - - i])
{
return false;
}
}
return true;
}
}

罗马数字转整数

罗马数字包含以下七种字符: I, V, X, LCD 和 M

题目地址 https://leetcode-cn.com/problems/roman-to-integer/submissions/

字符          数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "IX"
输出: 9

示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

笔者的方法:

时间200ms左右,

思路是

  • 把所有的情况放到哈希表中
  • 每次取一个位
  • 把 i 和 i+1 放一起,试试有没有区配的,有的话把 i 和 i+1 放一起
  • 没有的话,就是 只是计 i
    public class Solution
{
public int RomanToInt(string s)
{
char[] c = s.ToCharArray(); //将其转为字符数组
int sum = ; //值
Hashtable hashtable = new Hashtable();
//7个基本单位
hashtable.Add("I", );
hashtable.Add("V", );
hashtable.Add("X", );
hashtable.Add("L", );
hashtable.Add("C", );
hashtable.Add("D", );
hashtable.Add("M", );
//加上6种情况
hashtable.Add("IV", );
hashtable.Add("IX", );
hashtable.Add("XL", );
hashtable.Add("XC", );
hashtable.Add("CD", );
hashtable.Add("CM", );

/*
* 六种情况
IV 4 IX 9
XL 40 XC 90
CD 400 CM 9000
*/

            for (int i = ; i < c.Length; i++)
{
if (i + < c.Length && hashtable.ContainsKey(c[i].ToString() + c[i + ].ToString())) //如果发现两位一起能区配的话
{
sum += int.Parse(hashtable[c[i].ToString() + c[i + ].ToString()].ToString()); //获取值,HashTable的类型都是Object!
i++; //跳两位
}
else
{
sum += int.Parse(hashtable[c[i].ToString()].ToString());
} }
return sum;
}
}

换成字典

    public class Solution
{
public int RomanToInt(string s)
{
char[] c = s.ToCharArray(); //将其转为字符数组
int sum = ; //值
Dictionary<string, int> dictionary = new Dictionary<string, int>();
//7个基本单位
dictionary.Add("I", );
dictionary.Add("V", );
dictionary.Add("X", );
dictionary.Add("L", );
dictionary.Add("C", );
dictionary.Add("D", );
dictionary.Add("M", );
//加上6种情况
dictionary.Add("IV", );
dictionary.Add("IX", );
dictionary.Add("XL", );
dictionary.Add("XC", );
dictionary.Add("CD", );
dictionary.Add("CM", );

/*
* 六种情况
IV 4 IX 9
XL 40 XC 90
CD 400 CM 9000
*/

            for (int i = ; i < c.Length; i++)
{
if (i + < c.Length && dictionary.ContainsKey(c[i].ToString() + c[i + ])) //如果发现两位一起能区配的话
{
sum += dictionary[c[i].ToString() + c[i + ].ToString()]; //获取值,HashTable的类型都是Object!
i++; //跳两位
}
else
{
sum += dictionary[c[i].ToString()];
} }
return sum;
}
}

以上两个例子都会进行较多的装箱拆箱,下面主要使用if-else,switch,空间花销较大,但是如果测试例子较多,进行大量计算,时间会相对少一点。

    public class Solution
{
public int RomanToInt(string s)
{
int sum = ; //值 for (int i = ; i < s.Length; i++)
{
if (i + < s.Length) //如果后面还有别的字符
{
if (s[i] == 'I')
{
int a = ;
switch (s[i + ]) //"i%"
{
case 'V': a = ; i++; break;
case 'X': a = ; i++; break;
default: a = ; break;
}
sum += a;
}
else if (s[i] == 'X')
{
int a = ; switch (s[i + ]) //"X%"
{
case 'L': a = ; i++; break;
case 'C': a = ; i++; break;
default: a = ; break;
}
sum += a;
}
else if (s[i] == 'C')
{
int a = ;
switch (s[i + ]) //"X%"
{
case 'D': a = ; i++; break;
case 'M': a = ; i++; break;
default: a = ; break;
}
sum += a;
}
else
{
int a = ;
switch (s[i])
{case 'V': a = ; break;case 'L': a = ; break;case 'D': a = ; break;
case 'M': a = ; break;
}
sum += a;
}
} else
{
int a = ;
switch (s[i])
{
case 'I': a = ; break;
case 'V': a = ; break;
case 'X': a = ; break;
case 'L': a = ; break;
case 'C': a = ; break;
case 'D': a = ; break;
case 'M': a = ; break;
}
sum += a;
}
} return sum;
}
}

C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数的更多相关文章

  1. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  2. leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输 ...

  3. Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))

    564. 寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123&quo ...

  4. 算法题 19 二叉平衡树检查 牛客网 CC150

    算法题 19 二叉平衡树检查 牛客网 CC150 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针TreeNode* ro ...

  5. 判断一个整数是否是回文数C++实现 leetcode系列(九)

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  6. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串

    1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...

  7. c语言求回文数的三种算法的描述

    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...

  8. 算法笔记_038:特殊回文数(Java)

    目录 1 问题描述 2 解决方案 2.1 80分解法 2.2 网友标答解法   1 问题描述 问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这 ...

  9. Leecode刷题之旅-C语言/python-9.回文数

    /* * @lc app=leetcode.cn id=9 lang=c * * [9] 回文数 * * https://leetcode-cn.com/problems/palindrome-num ...

随机推荐

  1. button按钮被输入法顶起来,遮盖了input输入框

    在做手机端的表单提交的时候,在chrome浏览器调试的时候,忘记输入法会引起布局的问题.在webApp里input输入框,会自动调起输入法,但是输入法会改变浏览器的可视区域的大小.就是会把浏览器可视区 ...

  2. android开发学习笔记系列(1)-android起航

    前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...

  3. Golang xorm工具,根据数据库自动生成 go 代码

    使用 golang 操作数据库的同学都会遇到一个问题 —— 根据数据表结构创建对应的 struct 模型.因为 golang 的使用首字母控制可见范围,我们经常要设计 struct 字段名和数据库字段 ...

  4. RegExp正则表达式——更深层次解析

    转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp RegExp 构造 ...

  5. sql count执行速度测试

    要对数据库里面的数据数量进行统计使用,数据库的大概有2000w多的数据.数据库是mysql5.6 用的是远程连接测试 ELECT COUNT(*) 执行语句: select count( *) fro ...

  6. MD5 加盐(Java)

    本文转载自:https://blog.csdn.net/dingsai88/article/details/51637977 jar:https://pan.baidu.com/s/1-8JaRoUt ...

  7. Spring中的IOC示例

    Spring中的IOC示例 工程的大概内容是: 一个人在中国时用中国话问候大家,在国外时用英语问候大家. 其中, IHelloMessage是接口,用来定义输出问候信息 public interfac ...

  8. manven springmvc 项目中 slf4j 的配置使用(结合log4j 或者 logback)

    前言:每个maven springmvc 都应该有日志功能,SLF4J(Simple logging facade for Java)就是一种日志规范,它提供了一个共通接口,可以适配多种不同的LOG实 ...

  9. 说说HTML5中label标签的可访问性问题——张鑫旭

    一.开篇叨叨 一般稍微有些经验的页面制作人员都知道label标签可以优雅地扩大表单控件元素的点击区域,例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高 ...

  10. AGC006C Rabbit Exercise

    传送门 设 \(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置 对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\fr ...