力扣C++|一题多解之数学题专场(1)

 

目录

7. 整数反转

9. 回文数

12. 整数转罗马数字

13. 罗马数字转整数

29. 两数相除


7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

-如果反转后整数超过 32 位的有符号整数的范围 [2^31, 2^31 -1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

解法1: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int reverse(int x){int MAX = 0x7fffffff;int MIN = 1 << 31;ostringstream stream, smax, smin;string ss;stream << x;ss += stream.str();smax << MAX;string max_num = smax.str();smin << MIN;string min_num = smin.str();std::reverse(ss.begin(), ss.end());if (x < 0){ss.insert(0, "-");ss.pop_back();}if (x > 0 && ss.size() >= max_num.size() && (ss > max_num))return 0;else if (x < 0 && ss.size() >= min_num.size() && ss > min_num)return 0;elsereturn atoi(ss.c_str());}
};int main()
{Solution s;vector<int> nums = {123,-123,120,0};for(auto num:nums)cout << s.reverse(num) << endl;return 0;
} 

解法2:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)int reverse(int x){int flag = x < 0 ? -1 : 1;int num = 0;while (x){if ((flag == -1 && (INT_MIN / 10 > num)) || (flag == 1 && INT_MAX / 10 < num))return 0;num = num * 10 + x % 10;x /= 10;}return num;}
};int main()
{Solution s;vector<int> nums = {123,-123,120,0};for(auto num:nums)cout << s.reverse(num) << endl;return 0;
} 

解法3:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int reverse(int x){int rev = 0;while (x != 0){int pop = x % 10;x = x / 10;if (rev > INT_MAX / 10 || (rev == INT_MAX / 10 && pop > 7))return 0;if (rev < INT_MIN / 10 || (rev == INT_MIN / 10 && pop < -8))return 0;rev = rev * 10 + pop;}return rev;}
};int main()
{Solution s;vector<int> nums = {123,-123,120,0};for(auto num:nums)cout << s.reverse(num) << endl;return 0;
} 

9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

示例 4:

输入:x = -101
输出:false

提示:

  • -2^31 <= x <= 2^31 - 1

进阶:你能不将整数转为字符串来解决这个问题吗?

解法1: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:bool isPalindrome(long int x){long int rev;if (x < 0)return false;string str_x = to_string(x);std::reverse(str_x.begin(), str_x.end());stringstream out(str_x);out >> rev;return x == rev;}
};int main()
{Solution s;vector<int> nums = {121,-121,10,-101};for(auto num:nums)cout << s.isPalindrome(num) << endl;return 0;
} 

解法2:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:bool isPalindrome(long int x){long int midrev = 0;if (x < 0 || (x % 10 == 0 && x != 0))return false;while (x > midrev){midrev = midrev * 10 + x % 10;x /= 10;}return midrev == x || midrev / 10 == x;}
};int main()
{Solution s;vector<int> nums = {121,-121,10,-101};for(auto num:nums)cout << s.isPalindrome(num) << endl;return 0;
} 

解法3:  

#include <bits/stdc++.h>
using namespace std;class Solution {
public:bool isPalindrome(long int x) {if (x < 0) return false;long int sum = 0, t = x;while(x) {sum = sum * 10 + x % 10;x /= 10;}return t == sum;}
};int main()
{Solution s;vector<int> nums = {121,-121,10,-101};for(auto num:nums)cout << s.isPalindrome(num) << endl;return 0;
} 

12. 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3
输出: "III"

示例 2:

输入: num = 4
输出: "IV"

示例 3:

输入: num = 9
输出: "IX"

示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= num <= 3999

解法1:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:string getNum1000(int num1000){if (num1000 == 3){return "MMM";}else if (num1000 == 2){return "MM";}else if (num1000 == 1){return "M";}else{return "";}}string getNum100(int num100){switch (num100){case 1:return "C";case 2:return "CC";case 3:return "CCC";case 4:return "CD";case 5:return "D";case 6:return "DC";case 7:return "DCC";case 8:return "DCCC";case 9:return "CM";default:return "";}}string getNum10(int num10){switch (num10){case 1:return "X";case 2:return "XX";case 3:return "XXX";case 4:return "XL";case 5:return "L";case 6:return "LX";case 7:return "LXX";case 8:return "LXXX";case 9:return "XC";default:return "";}}string getNum1(int num1){switch (num1){case 1:return "I";case 2:return "II";case 3:return "III";case 4:return "IV";case 5:return "V";case 6:return "VI";case 7:return "VII";case 8:return "VIII";case 9:return "IX";default:return "";}}string intToRoman(int num){int num1000 = num / 1000;int num100 = (num % 1000) / 100;int num10 = (num % 100) / 10;int num1 = (num % 10);string res;res = getNum1000(num1000) + getNum100(num100) + getNum10(num10) + getNum1(num1);return res;}
};int main()
{Solution s;vector<int> nums = {3,4,9,58,1994};for(auto num:nums)cout << s.intToRoman(num) << endl;return 0;
} 

解法2:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:string intToRoman(int num){int values[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};string reps[13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};string res;for (int i = 0; i < 13; i++){while (num >= values[i]){num -= values[i];res += reps[i];}}return res;}
};int main()
{Solution s;vector<int> nums = {3,4,9,58,1994};for(auto num:nums)cout << s.intToRoman(num) << endl;return 0;
} 

解法3:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:string intToRoman(int num){string bit1[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};string bit10[10] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};string bit100[10] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};string bit1000[4] = {"", "M", "MM", "MMM"};return bit1000[num / 1000] + bit100[num % 1000 / 100] + bit10[num % 100 / 10] + bit1[num % 10];}
};int main()
{Solution s;vector<int> nums = {3,4,9,58,1994};for(auto num:nums)cout << s.intToRoman(num) << endl;return 0;
} 

13. 罗马数字转整数

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3
输出: "III"

示例 2:

输入: num = 4
输出: "IV"

示例 3:

输入: num = 9
输出: "IX"

示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= num <= 3999

解法1:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int romanToInt(string s){int sum = 0;for (int i = 1; i <= s.size(); i++){if (s[i - 1] == 'I' && s[i] == 'V'){sum += 4;i++;}else if (s[i - 1] == 'I' && s[i] == 'X'){sum += 9;i++;}else if (s[i - 1] == 'X' && s[i] == 'L'){sum += 40;i++;}else if (s[i - 1] == 'X' && s[i] == 'C'){sum += 90;i++;}else if (s[i - 1] == 'C' && s[i] == 'D'){sum += 400;i++;}else if (s[i - 1] == 'C' && s[i] == 'M'){sum += 900;i++;}else if (s[i - 1] == 'I'){sum += 1;}else if (s[i - 1] == 'V'){sum += 5;}else if (s[i - 1] == 'X'){sum += 10;}else if (s[i - 1] == 'L'){sum += 50;}else if (s[i - 1] == 'C'){sum += 100;}else if (s[i - 1] == 'D'){sum += 500;}else if (s[i - 1] == 'M'){sum += 1000;}}return sum;}
};int main()
{Solution s;vector<string> roma = {"III","IV","IX","LVIII","MCMXCIV"};for (auto r:roma)cout << s.romanToInt(r) << endl;return 0;
} 

解法2: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int romanToInt(string s){int result = 0;int n = s.length();for (int i = 0; i < n; i++){switch (s[i]){case 'I':if (i < n - 1 && s[i + 1] == 'V'){result += 4;i++;}else if (i < n - 1 && s[i + 1] == 'X'){result += 9;i++;}elseresult++;break;case 'V':result += 5;break;case 'X':if (i < n - 1 && s[i + 1] == 'L'){result += 40;i++;}else if (i < n - 1 && s[i + 1] == 'C'){result += 90;i++;}elseresult += 10;break;case 'L':result += 50;break;case 'C':if (i < n - 1 && s[i + 1] == 'D'){result += 400;i++;}else if (i < n - 1 && s[i + 1] == 'M'){result += 900;i++;}elseresult += 100;break;case 'D':result += 500;break;case 'M':result += 1000;}}return result;}
};int main()
{Solution s;vector<string> roma = {"III","IV","IX","LVIII","MCMXCIV"};for (auto r:roma)cout << s.romanToInt(r) << endl;return 0;
} 

解法3:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int romanToInt(string s){int result = 0;map<char, int> luomab;luomab.insert(map<char, int>::value_type('I', 1));luomab.insert(map<char, int>::value_type('V', 5));luomab.insert(map<char, int>::value_type('X', 10));luomab.insert(map<char, int>::value_type('L', 50));luomab.insert(map<char, int>::value_type('C', 100));luomab.insert(map<char, int>::value_type('D', 500));luomab.insert(map<char, int>::value_type('M', 1000));for (int i = 0; i < s.length(); i++){if (luomab[s[i]] >= luomab[s[i + 1]])result += luomab[s[i]];else{result += (luomab[s[i + 1]] - luomab[s[i]]);i++;}}return result;}
};int main()
{Solution s;vector<string> roma = {"III","IV","IX","LVIII","MCMXCIV"};for (auto r:roma)cout << s.romanToInt(r) << endl;return 0;
} 

29. 两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。

解法1:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int divide(int dividend, int divisor){int INI_MIN = -2147483648, INI_MAX = 2147483647;if (dividend == divisor)return 1;if (divisor == 1)return dividend;if (dividend == INI_MIN && divisor == -1)return INI_MAX;if (divisor == INI_MIN){if (dividend == INI_MIN)return 1;elsereturn 0;}bool sign = false;if (dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0){sign = true;}int result_1 = 0;if (dividend == INI_MIN){if (divisor > 0)dividend = dividend + divisor;elsedividend = dividend - divisor;result_1++;}dividend = abs(dividend);divisor = abs(divisor);while (dividend >= divisor){unsigned int temp = divisor, res = 1;while (dividend >= (temp << 1)){res <<= 1;temp <<= 1;}result_1 += res;dividend -= temp;}if (sign == true){return result_1;}else{return -result_1;}}
};int main()
{Solution s;cout << s.divide(10, 3) << endl;cout << s.divide(7, -3) << endl;return 0;
} 

解法2:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int divide(int dividend, int divisor){int signal = 1;unsigned int dvd = dividend;if (dividend < 0){signal *= -1;dvd = ~dvd + 1;}unsigned int dvs = divisor;if (divisor < 0){signal *= -1;dvs = ~dvs + 1;}int shift = 0;while (dvd > dvs << shift){shift++;}unsigned int res = 0;while (dvd >= dvs){while (dvd < dvs << shift){shift--;}res |= (unsigned int)1 << shift;dvd -= dvs << shift;}if (signal == 1 && res >= INT_MAX){return INT_MAX;}else{return res * signal;}}
};int main()
{Solution s;cout << s.divide(10, 3) << endl;cout << s.divide(7, -3) << endl;return 0;
} 

解法3:  

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int divide(int dividend, int divisor){if (dividend == INT_MIN && divisor == -1)return INT_MAX;if (dividend == 0)return 0;int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;long x = (dividend < 0) ? -(long)dividend : (long)dividend;long y = (divisor < 0) ? -(long)divisor : (long)divisor;long result = 0;while (x >= y){long temp = y, mid = 1;while (x >= (temp << 1)){mid <<= 1;temp <<= 1;}result += mid;x -= temp;}return sign > 0 ? result : -result;}
};int main()
{Solution s;cout << s.divide(10, 3) << endl;cout << s.divide(7, -3) << endl;return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧体育:冰壶比赛数字孪生

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

PHP与Golang对战:两种语言的比较与应用场景探讨

引言 在软件开发领域&#xff0c;选择一种合适的编程语言对于项目的成功至关重要。而在今天的文中&#xff0c;我们将探讨两个备受争议的编程语言——PHP与Golang之间的对战。通过比较它们的优势和应用场景&#xff0c;帮助开发者更好地了解如何选择适合自己项目的语言。 PHP的…

cocos creator Richtext点击事件

组件如图 添加ts自定义脚本&#xff0c;定义onClickFunc点击方法&#xff1a; import { Component, _decorator} from "cc";const { ccclass } _decorator; ccclass(RichTextComponent) export class RichTextComponent extends Component{public onClickFunc(even…

MySQL-DQL-小结

基本查询 条件查询 分组查询 排序查询 分页查询

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

源码解读之FutureTask如何实现最大等待时间

预备知识&#xff1a;Java 线程挂起的常用方式有以下几种 Thread.sleep(long millis)&#xff1a;这个方法可以让线程挂起一段时间&#xff0c;并释放 CPU 时间片&#xff0c;等待一段时间后自动恢复执行。这种方式可以用来实现简单的定时器功能&#xff0c;但如果不恰当使用会…

vue文件上传,文件打不开。文件上传 on-progress不触发

//文件上传带进度条<el-uploadv-model:file-list"fileList":limit"3":on-progress"beforeAvatarUpload"//on-progress 不触发&#xff0c;触发的关键在于覆盖原有的http请求:http-request"getFile":action"${app.api}/student…

投个 3D 冰壶,上班玩一玩 | 物理引擎

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

【原创】实现GPT中Transformer模型之框架概念

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 GPT是什么意思 GPT的全称是 Generative Pre-trained Transformer&#xff08;生成型预训练变换模型&#xff09;&#xff0c;它是基于大量语料数据上训练&#xff0c;以生成类似于人类自然语言的文本。其名称中的“预训练”…

linux远程服务器和本地服务器相互之间传输文件方法SSH(乌班图系统)

提前知道几点&#xff1a; 1.使用的MobaXterm软件 2.访问本地、远程服务器&#xff0c;需要账号和密码&#xff08;远程机器上的用户名和密码 远程机器的 IP 地址或主机名&#xff08;在同一子网上&#xff09;&#xff09;。每次访问需要输入密码&#xff0c;可以搜Ubuntu SS…

8、gateway使用和原理

一、什么是Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 2、Gateway简介 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 …