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 main

import "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 6
for 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 := 0
R := len(str) - 1
for L <= R {
t := L != R
if 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 - left
if left > right { // 都做完决定了!
// 如果左边做完决定的部分大于原始 或者 如果左边做完决定的部分等于原始&左边做完决定的部分不小于原始
// 有效!
// 否则,无效!
return twoSelectOne(leftMore || (!leftMore && rightLessEqualMore != 0), 1, 0)
}
// 如果上面没有return,说明决定没做完,就继续做
if leftMore { // 如果左边做完决定的部分大于原始
return num(N - (left << 1))
} else { // 如果左边做完决定的部分等于原始
ways := 0
// 当前left做的决定,大于原始的left
for cha := (low[left] + 1); cha <= '9'; cha++ {
if convert2(cha, left != right) != -1 {
ways += up(low, left+1, true, rightLessEqualMore)
}
}
// 当前left做的决定,等于原始的left
convert := 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 - left
if left > right {
return twoSelectOne(ll || (!ll && rs != 2), 1, 0)
}
if ll {
return num(N - (left << 1))
} else {
ways := 0
for 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 := 3
p1 := 5
ans := 0
for i := 3; i <= bits; i++ {
ans = 5 * p2
p2 = p1
p1 = 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. Python datetime库计算两个时间点之间的分钟(秒、天)数

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

  2. LeetCode 5198. 丑数 III(Java)容斥原理和二分查找

    题目链接:5198. 丑数 III 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c ...

  3. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  4. setTimeout 方法用于在指定的毫秒数后调用函数或计算表达式

    setTimeout 方法用于在指定的毫秒数后调用函数或计算表达式

  5. [Swift]LeetCode248.对称数 III $ Strobogrammatic Number III

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  6. java之路 把1到100之间的数的偶数相加

    /** *把1到100之间的数的偶数相加 */ class Demo{ public static void main(String[] args){ int i =1; int sum = 0; d ...

  7. java之路 打印1到100之间的数

    class Demo12{ public static void main(String[] args){ /** * 打印1到100之间的数 * 循环条件:1~100 * * 计数器 * */ // ...

  8. 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数

    * 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数 */ import java.util.*; public class Demo{ public s ...

  9. Atitit 计算word ppt文档的页数

    Atitit 计算word ppt文档的页数 http://localhost:8888/ http://git.oschina.net/attilax/ati_wordutil private vo ...

  10. activity之间參数传递&amp;&amp;获取activity返回值&amp;&amp;activity生命周期

    Activity之间參数传递 A activity想将參数传给B activity时能够利用Intent将消息带过去 Intent intent = new Intent(this,BActivity ...

随机推荐

  1. nvm的下载安装

    nvm下载地址:https://github.com/coreybutler/nvm-windows/releases 下载包,双击安装,选取路径, 注意:如果按默认的,安装在c盘的话,那之后的切换版 ...

  2. windows下创建虚拟环境

    创建虚拟环境依赖以下两个模块 virtualenv  和virtualenvwrapper-win 1.下载 2.修改环境变量,增加一条 WORKON_HOME:路径 3.  同步配置 去向Pytho ...

  3. DVWA-XSS (Stored) 存储型XSS

    存储型XSS,顾名思义,就是会传入数据库,长久的使用,常见为留言板,用户信息资料. LOW 审计源码 <?php // 是否提交 btnSign if( isset( $_POST[ 'btnS ...

  4. MySQL学习(四)锁机制

    分类 读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰 写锁(互斥锁):如果当前写操作没有完毕,则无法进行其他的读操作.写操作 操作范围 表锁:一次性对一张表整体加锁.如myisam存储 ...

  5. P7961 数列 题解

    对模拟的过程不敏感,对范围的数字不敏感 手玩是发现规律的好方式 计数 dp 以及一众计数题是明显短板,需要加紧突破. 样例解释已经较为明显地提示了这道题的大致做法.对于计数题,有动归与组合数学两种方法 ...

  6. 【WEB UI自动化】Selenium爬取用户的知乎回答时遇到10002:请求参数异常,请升级客户端后重试

    这里分享一个低配版知乎爬虫,利用了Selenium模块 爬取的过程中遇到了10002:请求参数异常,请升级客户端后重试,调用知乎某用户的回答API返回的HTTP状态码是403 Forbidden 之后 ...

  7. C_C++常用函数汇总

    1 string.h.cstring(C) (1)字符串连接函数 strcat.strncat strcat(char[ ], const char[ ]) strncat(char[ ], cons ...

  8. 从头开始——重新布置渗透测试环境的过程记录(From Windows To Mac)

    因为疫情和工作的原因,2022年整整一年我基本没有深度参与过网络安全和渗透测试相关的工作. 背景:之前因为使用习惯,一直使用的是ThinkPad X1 Extreme,可联想的品控实在拉胯,奈何Thi ...

  9. 【事故】记一次意外把企业项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私

    前言 缘由 在一个月黑风高的夜晚,正准备休息的我突然接到之前外包老总的亲切问候.一顿输出才知道三年前为了搭建流程化部署,将甲方的测试代码放到github上后忘记删除.现在被甲方的代码扫描机制扫到,并且 ...

  10. DevOps|研发效能价值如何衡量

    现在很多公司都在做或者计划做研发效能,也知道研发效能工作很重要,能提高产研运同学的协同效率,提高员工的工作效率和质量,提高业务交付效率和交付质量,但是价值有多大?效率又有多高呢?因为不容易说清楚,所以 ...