[TOC]
本文主要记录进制转换与数位分离的相关LeetCode题目的实现代码,直接给出本文各个题目的答案,供有需求的读者学习或复制。
一、进制转换的LeetCode题目
1、二进制转换的题目
1290. 二进制链表转整数(简单难度)
class Solution {
public:
// 二进制转十进制
int getDecimalValue(ListNode* head) {
vector<int> arr;
// 将链表元素加入数组中
ListNode* p=head;
while(p){
arr.push_back(p->val);
p=p->next;
}
// 二进制转换为十进制
int n=arr.size();
int k=1;
int sum=0;
for(int i=n-1;i>=0;i--){
sum+=arr[i]*k;
k*=2;
}
return sum;
}
};
191. 位1的个数(简单难度)
剑指 Offer 15. 二进制中1的个数(简单难度)
class Solution {
public:
int hammingWeight(uint32_t n) {
string res;
if(n==0) res="0";
while(n>0){
res=to_string(n%2)+res;
n=n/2;
}
int num=0;
for(char c:res){
if(c=='1') num++;
}
return num;
}
};
338. 比特位计数(简单难度)
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数(简单难度)
class Solution {
public:
// 十进制转换为2二进制
string ten2k(int num,int k=2){
if(num==0) return "0";
string ans;
while(num){
ans= to_string(num%k)+ans;
num/=k;
}
return ans;
}
vector<int> countBits(int n) {
vector<int> res;
for(int i=0;i<=n;i++){
string bits=ten2k(i);//二进制的字符串
int num=0;//统计字符串中1的个数
for(int j=0;j<bits.length();j++){
if(bits[j]=='1') num++;
}
res.push_back(num);
}
return res;
}
};
693. 交替位二进制数(简单难度)
class Solution {
public:
string ten2k(int n,int k=2){
if(n==0) return "0";
string res;
while(n>0){
res=to_string(n%k)+res;
n=n/k;
}
return res;
}
bool hasAlternatingBits(int n) {
string kbit=ten2k(n);
char flag='0';
for(int i=1;i<kbit.length();i++){
if(kbit[i]==kbit[i-1]) return false;
}
return true;
}
};
1009. 十进制整数的反码(简单难度)
476. 数字的补数(简单难度)
class Solution {
public:
string ten2k(int n,int k=2){
if(n==0) return "0";
string res;
while(n>0){
res=to_string(n%k)+res;
n=n/k;
}
return res;
}
int k2ten(string n,int k=2){
int sum=0;
long a=1;// 注意,必须为整型
for(int i=n.length()-1;i>=0;i--){
sum+=(n[i]-'0')*a;
a*=k;
}
return sum;
}
int bitwiseComplement(int num) {
string kbit = ten2k(num);//10进制转换为二进制
string res="";
for(char c:kbit){
if(c=='1'){
res+='0';
}
else {
res+='1';
}
}
int n=k2ten(res);
return n;
}
};
504. 七进制数(简单难度)
class Solution {
public:
string convertToBase7(int num) {
if(num==0) return "0";
string res;
// 处理正数
int tempNum=abs(num);//如果num为负数,变为正数
while(tempNum>0){
res=to_string(tempNum%7)+res;
tempNum=tempNum/7;
}
if(num<0) res.insert(res.begin(),'-');
return res;
}
};
405. 数字转换为十六进制数(简单难度)
class Solution {
public:
string toHex(int n) {
if(n==0) return "0";
unsigned num = n;//转换为无符号
string res;
while(num>0){
int base=num%16;
char c='0';
if(base>9) {
c=base-10+'a';
}else{
c=base+'0';
}
res+=c;
num=num/16;
}
reverse(res.begin(),res.end());
return res;
}
};
171. Excel 表列序号(简单难度)
这道题要求将Excel 表中的26个的由大写字母组成的列名称转换成相对应的列序号,因此本质就是一道26进制转换为10进制的题目,但是这道题与标准的进制转换(0-25)不同,因为Excel表的列序号是1到26,需要特殊处理。
class Solution {
public:
int titleToNumber(string columnTitle) {
int sum=0;
long k=1;//幂,幂要设置为long
for(int i=columnTitle.length()-1;i>=0;i--){
sum+=(columnTitle[i]-'A'+1)*k;
k*=26;
}
return sum;
}
};
168. Excel表列名称(简单难度)
class Solution {
public:
string convertToTitle(int n) {
// 10进制转26进制的模板,正常26进制是0-25,该题是1-26,
string res="";
while(n>0){
--n;//每一位都多了1,此处-1使其可以用正常的26进制代码处理
res+=n%26+'A';//将数字字符转换为大写字母字符,'A'是65,'0'是48
n=n/26;
}
reverse(res.begin(),res.end());//反转序列
return res;
}
};
2、数位分离
1281. 整数的各位积和之差(简单难度)
class Solution {
public:
int subtractProductAndSum(int n) {
int sum=0;
int x=1;
while(n>0){
sum+=n%10;
x*=n%10;
n=n/10;
}
return x-sum;
}
};
258. 各位相加(简单难度)
class Solution {
public:
int addDigits(int num) {
while(num>=10)// 大于等于1位数
{
int sum=0;
while(num>0){
sum+=num%10;
num=num/10;
};
num=sum;
}
return num;
}
};
1945. 字符串转化后的各位数字之和(简单难度)
class Solution {
public:
int getLucky(string s, int k) {
// 转换成数字
string str="";
for(int i=0;i<s.length();i++){
int num=s[i]-'0'-48;
str+=to_string(num);
}
// 重复转换操作k次
int sum=0;
while(k)//
{
sum=0;
for(int i=0;i<str.length();i++){
sum+=str[i]-'0';
}
str=to_string(sum);
k--;
}
return sum;
}
};
1837. K 进制表示下的各位数字总和(简单难度)
class Solution {
public:
int sumBase(int n, int k) {
// 从10进制转换为k进制
string kbits="";
if(n==0) kbits="0";
while(n>0){
kbits=to_string(n%k)+kbits;
n=n/k;
}
// 各位累和
int sum=0;
for(char c:kbits) sum+=c-'0';
return sum;
}
};
9. 回文数(简单难度)
class Solution {
public:
bool isPalindrome(int x) {
//0是回文数
if(x==0){
return true;
}
//负数不是回文数
if(x<0){
return false;
}
//正数进行数位分离
vector<int> arr;
while(x>0){
arr.push_back(x%10);
x = x/10;
}
// 双指针遍历
for(int i=0,j=arr.size()-1;i<j;i++,j--){
if(arr[i]!=arr[j]){
return false;
}
}
return true;
}
};