2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 写一个函数来计算范围在 [low, high] 之间中心对称数的个
2022-01-15:中心对称数 III。
中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。
写一个函数来计算范围在 [low, high] 之间中心对称数的个数。
示例:
输入:low = “50”,high = “100”,
输出:3。
解释:69,88和96是三个在该范围内的中心对称数。
注意:
由于范围可能很大,所以low和high都用字符串表示。
来自力扣248。
答案2022-01-15:
假设low=264,high=3422。
264到999的个数x,
1000到9999的个数y,3422到9999的个数z。
sum=x+y-z。如果high本身是有效数,sum=x+y-z+1。
代码用golang编写。代码如下:
package mainimport "fmt"func main() {ret := strobogrammaticInRange("50", "100")fmt.Println(ret)
}func strobogrammaticInRange(l, h string) int {low := []byte(l)high := []byte(h)if !equalMore(low, high) {return 0}lowLen := len(low)highLen := len(high)if lowLen == highLen {up1 := up(low, 0, false, 1)up2 := up(high, 0, false, 1)return up1 - up2 + twoSelectOne(valid(high), 1, 0)}ans := 0// lowLen = 3 hightLen = 7// 4 5 6for i := lowLen + 1; i < highLen; i++ {ans += all1(i)}ans += up(low, 0, false, 1)ans += down(high, 0, false, 1)return ans
}func equalMore(low, cur []byte) bool {if len(low) != len(cur) {return len(low) < len(cur)}for i := 0; i < len(low); i++ {if low[i] != cur[i] {return low[i] < cur[i]}}return true
}func valid(str []byte) bool {L := 0R := len(str) - 1for L <= R {t := L != Rif convert2(str[L], t) != int(str[R]) {return false}L++R--}return true
}// left想得到cha字符,right配合应该做什么决定,
// 如果left怎么也得不到cha字符,返回-1;如果能得到,返回right配合应做什么决定
// 比如,left!=right,即不是同一个位置
// left想得到0,那么就right就需要是0
// left想得到1,那么就right就需要是1
// left想得到6,那么就right就需要是9
// left想得到8,那么就right就需要是8
// left想得到9,那么就right就需要是6
// 除此了这些之外,left不能得到别的了。
// 比如,left==right,即是同一个位置
// left想得到0,那么就right就需要是0
// left想得到1,那么就right就需要是1
// left想得到8,那么就right就需要是8
// 除此了这些之外,left不能得到别的了,比如:
// left想得到6,那么就right就需要是9,而left和right是一个位置啊,怎么可能即6又9,返回-1
// left想得到9,那么就right就需要是6,而left和right是一个位置啊,怎么可能即9又6,返回-1
func convert2(cha byte, diff bool) int {switch cha {case '0':return '0'case '1':return '1'case '6':return twoSelectOne(diff, '9', -1)case '8':return '8'case '9':return twoSelectOne(diff, '6', -1)default:return -1}
}// low [左边已经做完决定了 left.....right 右边已经做完决定了]
// 左边已经做完决定的部分,如果大于low的原始,leftMore = true;
// 左边已经做完决定的部分,如果不大于low的原始,那一定是相等,不可能小于,leftMore = false;
// 右边已经做完决定的部分,如果小于low的原始,rightLessEqualMore = 0;
// 右边已经做完决定的部分,如果等于low的原始,rightLessEqualMore = 1;
// 右边已经做完决定的部分,如果大于low的原始,rightLessEqualMore = 2;
// rightLessEqualMore < = >
// 0 1 2
// 返回 :没做决定的部分,随意变,几个有效的情况?返回!
func up(low []byte, left int, leftMore bool, rightLessEqualMore int) int {N := len(low)right := N - 1 - leftif left > right { // 都做完决定了!// 如果左边做完决定的部分大于原始 或者 如果左边做完决定的部分等于原始&左边做完决定的部分不小于原始// 有效!// 否则,无效!return twoSelectOne(leftMore || (!leftMore && rightLessEqualMore != 0), 1, 0)}// 如果上面没有return,说明决定没做完,就继续做if leftMore { // 如果左边做完决定的部分大于原始return num(N - (left << 1))} else { // 如果左边做完决定的部分等于原始ways := 0// 当前left做的决定,大于原始的leftfor cha := (low[left] + 1); cha <= '9'; cha++ {if convert2(cha, left != right) != -1 {ways += up(low, left+1, true, rightLessEqualMore)}}// 当前left做的决定,等于原始的leftconvert := convert2(low[left], left != right)if convert != -1 {if convert < int(low[right]) {ways += up(low, left+1, false, 0)} else if convert == int(low[right]) {ways += up(low, left+1, false, rightLessEqualMore)} else {ways += up(low, left+1, false, 2)}}return ways}
}// ll < =
// rs < = >
func down(high []byte, left int, ll bool, rs int) int {N := len(high)right := N - 1 - leftif left > right {return twoSelectOne(ll || (!ll && rs != 2), 1, 0)}if ll {return num(N - (left << 1))} else {ways := 0for cha := byte(twoSelectOne((N != 1 && left == 0), '1', '0')); cha < high[left]; cha++ {if convert2(cha, left != right) != -1 {ways += down(high, left+1, true, rs)}}convert := convert2(high[left], left != right)if convert != -1 {if convert < int(high[right]) {ways += down(high, left+1, false, 0)} else if convert == int(high[right]) {ways += down(high, left+1, false, rs)} else {ways += down(high, left+1, false, 2)}}return ways}
}func num(bits int) int {if bits == 1 {return 3}if bits == 2 {return 5}p2 := 3p1 := 5ans := 0for i := 3; i <= bits; i++ {ans = 5 * p2p2 = p1p1 = ans}return ans
}// 如果是最开始 :
// Y X X X Y
// -> 1 X X X 1
// -> 8 X X X 8
// -> 9 X X X 6
// -> 6 X X X 9
// 如果不是最开始 :
// Y X X X Y
// -> 0 X X X 0
// -> 1 X X X 1
// -> 8 X X X 8
// -> 9 X X X 6
// -> 6 X X X 9
// 所有的len位数,有几个有效的?
func all1(len0 int) int {ans := twoSelectOne((len0&1) == 0, 1, 3)for i := twoSelectOne((len0&1) == 0, 2, 3); i < len0; i += 2 {ans *= 5}return ans << 2
}// 我们课上讲的
func all2(len0 int, init0 bool) int {if len0 == 0 { // init == true,不可能调用all(0)return 1}if len0 == 1 {return 3}if init0 {return all2(len0-2, false) << 2} else {return all2(len0-2, false) * 5}
}func twoSelectOne(c bool, a, b int) int {if c {return a} else {return b}
}
执行结果如下:
左神java代码
2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 写一个函数来计算范围在 [low, high] 之间中心对称数的个相关推荐
- php中getdistance函数_php计算两个经纬度地点之间的距离
/** * @param $lat1 * @param $lng1 * @param $lat2 * @param $lng2 * @return int */ function getDistanc ...
- LeetCode 248. 中心对称数 III(DFS/BFS)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 写一个函数来计算范围在 [low ...
- datediff函数,计算两个日期之间的天数\月数\年数
datedif函数是一个隐藏函数但又确实存在,可以计算两个日期之间的天数\月数\年数. 时分秒转换为数字格式后的数字代表的是天数. datedif 年数.月数.日数 返回年数月数日数 =DATEDIF ...
- 小学奥数 7657 连乘积末尾0的个数-2022.01.26
http://noi.openjudge.cn/math/7657/ /* 小学奥数 7657 连乘积末尾0的个数-2022.01.26 http://noi.openjudge.cn/math/76 ...
- python的datetime举例_Python datetime库计算两个时间点之间的分钟(秒、天)数
计算两个时间点之间的分钟数 import datetime def minNums(startTime, endTime): '''计算两个时间点之间的分钟数''' # 处理格式,加上秒位 start ...
- 游戏设计中的算法题——计算宝物升级所需的资源数
当今社会,智能手机的飞速发展.使得可以做到人手一部智能手机.而各种应用层出不穷. 手游(手机游戏)的出现,满足了人们对打发碎片时间的需求. 而在游戏中,宝物升级是最常见的剧情元素之一.而优秀的游戏设计 ...
- 5198.丑数III
Time: 20190922 Type: Medium 题目描述 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a ...
- 求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12
目录 编程练习 任务 编程练习 编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12. 任务 1.循环遍历200到300之间的整数 2.分别取出个位.十位和 ...
- Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)
Python 计算从1-N(N可以任何数)内的素数(算法优化.并行计算.多线程优化计算) 1.项目介绍 1.1研究背景 1.2题目介绍 2.项目优化过程 2.1 源代码 2.2 优化1 - 数理的角度 ...
最新文章
- 前端开发-日常开发沉淀之生产环境与开发环境
- dbca no protocol support
- 演示:使用Sniffer统计与分析流量
- python彩色螺旋线_解决python彩色螺旋线绘制引发的问题
- mysql 当前timestamp_MySQL表结构使用timestamp以自动获取当前时间
- 一步一步写算法(之 可变参数)
- 【ZeroClipboard is not defined】的解决方法
- html通用的排班方法,呼叫中心排班的两种主要方法
- 问题六:C++中是干嘛用的(引用类型)
- Fushsia:一次对操作系统的重构
- linux bios格式化磁盘,BIOS设置与磁盘分区、格式化.doc
- mysql 统计市县的数量
- scrapy框架爬取大单、中单、小单净流入流出
- 求长方形的周长和面积c语言两个函数_怎么用C语言编程设计“输入长方形的长和宽,求长方形的面积”的程序...
- 为什么uzi排到古手羽就秒_Uzi排到古手羽秒退引热议?“网友发表看法,弹幕疑似给出答案”...
- 树莓派使用create_ap创建局域网
- 免费的天气查询api接口调用
- #{}和¥{}的区别
- arthas热更新线上代码
- 智能化引领中国铁路发展
热门文章
- 腾讯云​学生机官网(云+校园)
- 厦门大学计算机科学与工程学院,厦门大学计算机系
- python数据可视化是什么_Python数据可视化的四种简易方法
- 【嵌入式模块】常用扩展芯片及数据手册总结
- 谷歌浏览器复制禁止复制文字网页上的文字
- eclipes代码提示及防空格自动补全
- Win10没有蓝牙功能怎么办 win10蓝牙图标不见了怎么办
- 【成功实现】python对tif图片的读取与保存
- HDU 2121 Ice_cream’s world II (最小树形图+虚根)
- english book1 unit8