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] 之间中心对称数的个相关推荐

  1. php中getdistance函数_php计算两个经纬度地点之间的距离

    /** * @param $lat1 * @param $lng1 * @param $lat2 * @param $lng2 * @return int */ function getDistanc ...

  2. LeetCode 248. 中心对称数 III(DFS/BFS)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 写一个函数来计算范围在 [low ...

  3. datediff函数,计算两个日期之间的天数\月数\年数

    datedif函数是一个隐藏函数但又确实存在,可以计算两个日期之间的天数\月数\年数. 时分秒转换为数字格式后的数字代表的是天数. datedif 年数.月数.日数 返回年数月数日数 =DATEDIF ...

  4. 小学奥数 7657 连乘积末尾0的个数-2022.01.26

    http://noi.openjudge.cn/math/7657/ /* 小学奥数 7657 连乘积末尾0的个数-2022.01.26 http://noi.openjudge.cn/math/76 ...

  5. python的datetime举例_Python datetime库计算两个时间点之间的分钟(秒、天)数

    计算两个时间点之间的分钟数 import datetime def minNums(startTime, endTime): '''计算两个时间点之间的分钟数''' # 处理格式,加上秒位 start ...

  6. 游戏设计中的算法题——计算宝物升级所需的资源数

    当今社会,智能手机的飞速发展.使得可以做到人手一部智能手机.而各种应用层出不穷. 手游(手机游戏)的出现,满足了人们对打发碎片时间的需求. 而在游戏中,宝物升级是最常见的剧情元素之一.而优秀的游戏设计 ...

  7. 5198.丑数III

    Time: 20190922 Type: Medium 题目描述 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a ...

  8. 求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12

    目录 编程练习 任务 编程练习 编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12. 任务 1.循环遍历200到300之间的整数 2.分别取出个位.十位和 ...

  9. Python 计算从1-N(N可以任何数)内的素数(并行计算、多线程优化计算)

    Python 计算从1-N(N可以任何数)内的素数(算法优化.并行计算.多线程优化计算) 1.项目介绍 1.1研究背景 1.2题目介绍 2.项目优化过程 2.1 源代码 2.2 优化1 - 数理的角度 ...

最新文章

  1. 前端开发-日常开发沉淀之生产环境与开发环境
  2. dbca no protocol support
  3. 演示:使用Sniffer统计与分析流量
  4. python彩色螺旋线_解决python彩色螺旋线绘制引发的问题
  5. mysql 当前timestamp_MySQL表结构使用timestamp以自动获取当前时间
  6. 一步一步写算法(之 可变参数)
  7. 【ZeroClipboard is not defined】的解决方法
  8. html通用的排班方法,呼叫中心排班的两种主要方法
  9. 问题六:C++中是干嘛用的(引用类型)
  10. Fushsia:一次对操作系统的重构
  11. linux bios格式化磁盘,BIOS设置与磁盘分区、格式化.doc
  12. mysql 统计市县的数量
  13. scrapy框架爬取大单、中单、小单净流入流出
  14. 求长方形的周长和面积c语言两个函数_怎么用C语言编程设计“输入长方形的长和宽,求长方形的面积”的程序...
  15. 为什么uzi排到古手羽就秒_Uzi排到古手羽秒退引热议?“网友发表看法,弹幕疑似给出答案”...
  16. 树莓派使用create_ap创建局域网
  17. 免费的天气查询api接口调用
  18. #{}和¥{}的区别
  19. arthas热更新线上代码
  20. 智能化引领中国铁路发展

热门文章

  1. 腾讯云​学生机官网(云+校园)
  2. 厦门大学计算机科学与工程学院,厦门大学计算机系
  3. python数据可视化是什么_Python数据可视化的四种简易方法
  4. 【嵌入式模块】常用扩展芯片及数据手册总结
  5. 谷歌浏览器复制禁止复制文字网页上的文字
  6. eclipes代码提示及防空格自动补全
  7. Win10没有蓝牙功能怎么办 win10蓝牙图标不见了怎么办
  8. 【成功实现】python对tif图片的读取与保存
  9. HDU 2121 Ice_cream’s world II (最小树形图+虚根)
  10. english book1 unit8