首页 > 编程语言 >【小航的算法日记】进制转换(二) - 进阶

【小航的算法日记】进制转换(二) - 进阶

时间:2022-11-29 10:36:24浏览次数:40  
标签:columnNumber 进制 示例 int res columnTitle 小航 进阶


目录

  • ​​一、概念​​
  • ​​二、模板​​
  • ​​三、例题​​
  • ​​题:202. 快乐数​​
  • ​​解:​​
  • ​​题:168. Excel表列名称​​
  • ​​解:​​
  • ​​题:171. Excel 表列序号​​
  • ​​解:​​
  • ​​题:483. 最小好进制​​
  • ​​解:​​

一、概念

​转化不常用的进制​​​、​​对应偏移​

二、模板

看例题

三、例题

题:202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
  • 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

1 <= n <= 231 - 1

解:

解题思路:​​双指针​​​ => ​​链表找环​

情况1:

【小航的算法日记】进制转换(二) - 进阶_链表


情况2:

【小航的算法日记】进制转换(二) - 进阶_数据结构_02


情况3:值会越来越大,最后接近无穷大。(排除)

AC代码:

class Solution {
public boolean isHappy(int n) {
int l = n, f = getNext(n);
while(f != 1 && l != f) {
l = getNext(l);
f = getNext(getNext(f));
}
return f == 1;
}
int getNext(int num) {
int x = 0;
while(num != 0) {
int digit = num % 10;
x += digit * digit;
num /= 10;
}
return x;
}
}

题:168. Excel表列名称

给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

示例 1:

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

提示:

1 <= columnNumber <= 231 - 1

解:

解题思路:​​数学模拟​

AC代码:

class Solution {
public String convertToTitle(int columnNumber) {
StringBuilder res = new StringBuilder();
while(columnNumber != 0) {
int digit = (columnNumber - 1) % 26 + 1; // 1-26对应
res.append((char)('A' + digit - 1));
columnNumber = (columnNumber - digit) / 26; // 这里要减去digit
}
return res.reverse().toString();
}
}

解题思路:因为有错位问题,所以这里有简洁的写法
【小航的算法日记】进制转换(二) - 进阶_git_03AC代码:

class Solution {
public String convertToTitle(int columnNumber) {
StringBuilder res = new StringBuilder();
while(columnNumber != 0) {
-- columnNumber;
res.append((char)('A' + columnNumber % 26));
columnNumber = columnNumber / 26;
}
return res.reverse().toString();
}
}

题:171. Excel 表列序号

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

示例 1:

输入: columnTitle = "A"
输出: 1

示例 2:

输入: columnTitle = "AB"
输出: 28

示例 3:

输入: columnTitle = "ZY"
输出: 701

提示:

1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内

解:

解题思路:​​数学模拟​

AC代码:

class Solution {
public int titleToNumber(String columnTitle) {
int x = 0;
for(char c : columnTitle.toCharArray()) {
x = x * 26 + (int)(c - 'A' + 1);
}
return x;
}
}

题:483. 最小好进制

以字符串的形式给出 n , 以字符串的形式返回 n 的最小 ​​好进制​​ 。

如果 ​​n​​​ 的 ​​k(k>=2)​​​进制数的所有数位全为1,则称 ​​k(k>=2)​​​ 是 ​​n​​ 的一个 好进制 。

示例 1:

输入:n = "13"
输出:"3"
解释:13 的 3 进制是 111。

示例 2:

输入:n = "4681"
输出:"8"
解释:4681 的 8 进制是 11111。

示例 3:

输入:n = "1000000000000000000"
输出:"999999999999999999"
解释:1000000000000000000 的 999999999999999999 进制是 11。

提示:

n 的取值范围是 [3, 1018]
n 没有前导 0

解:

解题思路:​​数学推导​

AC代码:

class Solution {
public String smallestGoodBase(String n) {
long m = Long.parseLong(n);
int max = (int)(Math.log(m) / Math.log(2) + 1);
for (int len = max; len >= 3; len--) {
long k = (long)Math.pow(m, 1.0 / (len - 1));
long res = 0;
for (int i = 0; i < len; i++) res = res * k + 1;
if (res == m) return String.valueOf(k);
}
return String.valueOf(m - 1);
}
}


标签:columnNumber,进制,示例,int,res,columnTitle,小航,进阶
From: https://blog.51cto.com/u_15895329/5894204

相关文章

  • 【小航的算法日记】进制转换(一) - 入门
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:剑指Offer15.二进制中1的个数​​​​解:​​​​题:258.各位相加​​​​解:​​​​题:1290.二进制链表转......
  • 【小航的算法日记】字符串算法(二) - 字符串比较
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:剑指Offer05.替换空格​​​​解:​​​​题:面试题10.05.稀疏数组搜索​​​​解:​​​​题:1763.最长的......
  • 【小航的算法日记】线段树
    本内容取经于:https://leetcode.cn/problems/my-calendar-i/solution/by-lfool-xvpv/一、概念概念区分:线段树解决的是「区间和」的问题,且该「区间」会被修改前缀和解决的是......
  • 【小航的算法日记】字符串
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:344.反转字符串​​​​解:​​​​题:541.反转字符串II​​​​解:​​​​题:剑指Offer05.替换空格​​​......
  • 【小航的算法日记】哈希
    一、概念哈希表、哈希函数、哈希碰撞二、模板三、例题题:242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个......
  • 【小航的算法日记】图论
    目录​​一、概念、模板​​​​存图方式:​​​​1.邻接矩阵​​​​2.邻接表​​​​3.类​​​​算法:​​​​拓扑排序:​​​​最短路问题:​​​​1.Floyd「多源汇最短路......
  • C语言进阶题库
    C语言进阶题库​​1.约瑟夫生者死者小游戏​​​​2.五人分鱼​​​​3.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?​​​​4.企业发放的奖金根......
  • 1758. 生成交替二进制字符串的最少操作数
    1758.生成交替二进制字符串的最少操作数classSolution{publicintminOperations(Strings){char[]c=s.toCharArray();intn=c.length;......
  • WIN10计算器-关于十六进制
      1.HEX代表十六进制2.DEC代表十进制3.OCT代表八进制4.BIN代表二进制   ......
  • CodeStar第八周周赛普及进阶组
    T1:垃圾游戏3本题难度中等,一道稍有变化的01背包题。一般的01背包是考虑每个物品取和不取,本题是考虑每个物品带走(相当于取)还是分解(相当于不取),如果分解,也会贡献相应价值记d......