
数学
cx_cs
这个作者很懒,什么都没留下…
展开
-
119. 杨辉三角 II
无原创 2023-03-07 11:30:11 · 69 阅读 · 0 评论 -
89. 格雷编码
无原创 2022-08-19 09:38:55 · 80 阅读 · 0 评论 -
60. 排列序列
无原创 2023-03-09 10:21:39 · 85 阅读 · 0 评论 -
12. 整数转罗马数字
无原创 2022-08-18 12:02:07 · 63 阅读 · 0 评论 -
43. 字符串相乘
无原创 2022-08-18 11:01:57 · 127 阅读 · 0 评论 -
202. 快乐数
要求:算每一位的平方之和,最后是否回到1思路:最大数10位,就算10个81也才810,必然会有重复的。我们可以用哈希表记录循环,也可以快慢指针。如果有循环那么相遇时肯定不是1,如果没有循环那么相遇时肯定是1class Solution {public: int bitSquareSum(int n) { int sum = 0; while(n > 0) { int bit = n % 10;原创 2022-04-11 14:11:19 · 120 阅读 · 0 评论 -
166. 分数到小数
要求:模拟分子除以分母思路:有理数包括整数和分数,分数为有限小数或者无限循环。出现无限循环可以看余数class Solution { using ll = long long;public: string fractionToDecimal(int numerator, int denominator) { ll n = numerator, d = denominator; string ret; // 计算整数部分,化成正数原创 2022-04-11 14:09:02 · 111 阅读 · 0 评论 -
149. 直线上最多的点数
要求:很多点,找共线最多点个数思路:暴力O(n3),优化是对每个点i,用哈希表记录其与所有点的斜率,找出现次数最多的斜率。这里斜率浮点可能不够要存整数,细节见题解https://leetcode-cn.com/problems/max-points-on-a-line/solution/zhi-xian-shang-zui-duo-de-dian-shu-by-le-tq8f/class Solution {public: int gcd(int a, int b) { re原创 2022-04-05 13:55:42 · 243 阅读 · 0 评论 -
118. 杨辉三角
要求:每个数等于其左上角和右上角之和思路:在二维数组是正上和正上左边的和class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> v(numRows); v[0]={1}; for(int i=1;i<numRows;++i){ v[i].resize(原创 2022-04-05 10:54:48 · 128 阅读 · 0 评论 -
29. 两数相除
要求:不用乘除取余思路:直接减法会超时,要成倍class Solution {public: int divide(int dividend, int divisor) { if (dividend == INT_MIN && divisor == -1) return INT_MAX; if (divisor == 1) return dividend; bool flag =原创 2022-03-26 21:54:31 · 441 阅读 · 0 评论 -
13. 罗马数字转整数
要求:rt思路:一般前一个字母代表的数字都是大于后一个,如果反过来说明是特殊情况class Solution {private: unordered_map<char, int> symbolValues = { {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000},原创 2022-03-26 21:31:40 · 254 阅读 · 0 评论 -
7. 整数反转
要求:考虑溢出思路:本题有个隐藏条件,就是输入的是int,其首位必为1和2,所以翻转后不必考虑最后一位的情况,下面代码里可以省略class Solution {public: int reverse(int x) { int sum=0; while(x){ if(sum>0){ if(sum==214748364&&x%10>7)return 0;原创 2022-03-26 20:24:27 · 405 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数
要求:O(log(m+n))思路:分割线将两个数组划分,奇数时左边多一个,因此左边个数是(m+n+1)/2=k,分隔线右边元素下标i+j=k在小数组二分否则k-i越界满足交叉小于等于,二分查找使得a[i]>=b[j-1],那么如何使的a[i-1]<=b[j]?答案是j右移i左移,即我们只需要在a[i]>=b[j-1]时左移i即可最后看注释,边界简单class Solution {public: double findMedianSortedArrays(vector&l原创 2022-03-17 12:39:35 · 171 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
要求:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等思路:找规律class Solution {public: int findNthDigit(int n) { long start=1,digit=1; long long count=9*start*digit; while(n>count){ n原创 2022-03-07 18:31:59 · 66 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数
要求:rt思路:太难了例子168完整意思是从该位0到9百位取1,69,其实就是168/1000*100+不完整,不完整部分为n=168%1000=168,那共有168-100+1次十位取1,则百位取0个位取0到9百位取1个位取0到9,2x10=20,其实就是168/100x10+不完整,不完整部分为n=68%100=68,68大于20那共有10次个位取1,则百位取0,十位取0-9,10,百位取1,十位取0-6,7,加起来17,其实就是168/10x1+不完整,不完整部分位n=8%10=8,8大于原创 2022-03-07 14:03:39 · 81 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
要求:不能用幂函数,有负指数思路:快速幂class Solution {public: double myPow(double x, int n) { if(n==0)return 1; double res=1*x; double rest=1; double sign=n>0?1:-1; n=abs(n); while(n>1){ if(n&1){原创 2022-03-04 10:58:27 · 62 阅读 · 0 评论 -
628. 三个数的最大乘积
要求:明显是正正正或者正负负思路:class Solution {public: int maximumProduct(vector<int>& nums) { // 最小的和第二小的 int min1 = INT_MAX, min2 = INT_MAX; // 最大的、第二大的和第三大的 int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;原创 2021-11-19 12:31:27 · 442 阅读 · 0 评论 -
238. 除自身以外数组的乘积
要求:如题,时间要O(n)思路:算前缀积后缀积再相乘class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); vector<int> left(n,1),right(n,1),ans(n,1); for(int i=1;i<n;++i) left原创 2021-11-19 12:27:26 · 86 阅读 · 0 评论 -
326. 3的幂
要求:判断3的幂不能用循环递归思路:3的19class Solution {public: bool isPowerOfThree(int n) { return n>0&&1162261467%n==0; }};原创 2021-11-19 10:52:24 · 68 阅读 · 0 评论 -
367. 有效的完全平方数
要求:判断是否平方数,不能用sqrt思路:1,4,9,16,间隔是等差数列3,5,7,9class Solution {public: bool isPerfectSquare(int num) { int arr=1,cur=1; while(true){ if(cur==num)return true; else{ arr+=2; if(num-c原创 2021-11-19 10:39:55 · 308 阅读 · 0 评论 -
169. 多数元素
要求:找出现超一半的、思路:空间要求O(1)class Solution {public: int majorityElement(vector<int>& nums) { int cnt=0,num=0; for(int i=0;i<nums.size();++i){ if(cnt==0){ num=nums[i]; ++cnt;原创 2021-11-19 10:26:52 · 342 阅读 · 0 评论 -
462. 最少移动次数使数组元素相等 II
要求:如题思路:三个元素abc,到中位数距离:c-a,到平均数距离:c-a+|b-(a+b+c)/3|到众数举个反例:11234,距离6,中位数距离4暂无严格证明偶数时任一均可法一:直接相加,击败57%class Solution {public: int minMoves2(vector<int>& nums) { sort(nums.begin(),nums.end()); int sum=0; for(int n原创 2021-11-16 13:10:39 · 121 阅读 · 0 评论 -
415. 字符串相加
要求:整数字符串加法思路:class Solution {public: string addStrings(string num1, string num2) { if(num1.length()<num2.length())swap(num1,num2); string ans=""; int l1=num1.length()-1,l2=num2.length()-1; int carry=0; for(原创 2021-11-16 12:08:42 · 72 阅读 · 0 评论 -
67. 二进制求和
要求:二进制字符串求和思路:就我写这么长?class Solution {public: string addBinary(string a, string b) { if(a.length()<b.length())swap(a,b); int la=a.length(),lb=b.length(); int enter=0; string ans=string(la,'0'); int i,j;原创 2021-11-16 11:39:42 · 65 阅读 · 0 评论 -
172. 阶乘后的零
要求:求阶乘后的数末尾几个0思路:10的质数分解是25,有多少0等价于多少个52,因为阶乘所有数里2比较多所以等价于5个数,即求1到n总共有多少个因子5class Solution {public: int trailingZeroes(int n) { if(n==0)return 0; int ans=0; for(int i=5;i<=n;i+=5){ int tmp=i; while(原创 2021-11-14 18:44:05 · 219 阅读 · 0 评论 -
168. Excel表列名称
要求:十进制转a到z思路:本题坑点在于他妈的进制是从1开始的1到26,取余的话1%26=1映射A,26%26=0映射z??正确解法是将数减1再取余class Solution {public: string convertToTitle(int columnNumber) { string s=""; while(columnNumber!=0){ --columnNumber; char c=columnNumb原创 2021-11-14 12:29:18 · 223 阅读 · 0 评论 -
405. 数字转换为十六进制数
要求:转16进制,负数要补码的十六进制思路:计算机中正数存原码负数以补码形式存储,-8原码1000反码1111,补码1000,对32位有符号-1而言,原码8000001,反码fffffffe,补码fffffff。本题意思是正数直接输出原码,负数的话是直接输出补码正常1对应0x1,-1对应-0x1,但本题还得输出补码太麻烦,直接用无符号数没有三种码的概念可以无视正负左移就是:0补最低位,然后丢弃最高位。右移就是:正数的话补0,负数补1。无符号数都是补0class Solution {public原创 2021-11-14 12:10:08 · 576 阅读 · 0 评论 -
504. 七进制数
要求:10进制转7进制思路:注意为0,负数情况,方法是除以7取余数倒着拼接class Solution {public: string convertToBase7(int num) { if(num==0)return "0"; string s=""; bool flag=true; if(num<0)flag=false; num=abs(num); while(num!=0){原创 2021-11-14 11:10:01 · 212 阅读 · 0 评论 -
最大公约数
gcd(0,n)=na=bq+r,gcd(a,b)=gcd(b,r),辗转相除,最后r=0返回b注意a是大数int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}最小公倍数int lcm(int a, int b) { return a * b / gcd(a, b);}原创 2021-11-13 11:29:31 · 1659 阅读 · 0 评论 -
204. 计数质数
要求:找小于n的质数个数思路:法一:暴力显然可以但是太慢了,埃氏筛:若x为质数则其倍数为合数.isprime数组首先全部置1,标记质数为1,然后从2开始一个个筛掉合数,为什么j要从i开始?因为前面的例如2i被2标记过了,只要标记i*(i+1),i*(i+2),时间O(nloglogn)class Solution {public: int countPrimes(int n) { int num=0; vector<int> isprime(n,1原创 2021-11-13 11:07:11 · 564 阅读 · 0 评论