摘要:
解法1. f(x,y) = f(y, y%x) (y>0) 辗转相除法2. 取模运算较为耗时, 将取模变成相减. 但对极端数据效果很差, 比如 gcd(1000,1)3. 分析公约数的特点. 3.1 若 x,y 均为偶数, 那么 f(x,y) = 2*f(x/2, y/2) 3.2 若 x 为偶数, y 为奇数, 那么 f(x,y) = 2*f(x/2, y) 3.3 若都为奇数, f(x,y) = f(x, x-y) 那么下一步肯定有一个偶数 3.4 这样一来, 时间复杂度下降到 o(log(max(x,y))) 阅读全文
摘要:
有限小数和无限循环小数转化成分数比如 0.9 -> 9/100.333(3) -> 1/3解法1. 主要涉及到一个数学公式的计算.2. 对于有限小数, 分子分母求最大公约数即可3. 对于无限循环小数, 第一步是将非循环部分剔除. 仅讨论循环部分.4. 0.b(b.size() = c ==> b.b(b.size()) = c*pow(10, b.size()) ==> 0.b(b.size()) = c*k-c ==> c = (pow(10,b.size()-1)/b 阅读全文
摘要:
总结1. 使用加法解决指数问题时, 可用背包问题的变形2. 题目用到的公式和求解 1~N 中 1 出现的次数的公式类似题目1. 给定一个整数 N, 那么 N 的阶乘 N! 末尾有多少个 0 呢2. 求解 N! 的二进制表示中最低位 1 的位置思路1. 第一道题相当于求解 N! 分别是 2^a 和 5 ^b, 第二道题是 2^a2. 公式: Z = [N/5] + [N/5^2] +... [N/5] 表示不大于 N 的数中 5 的倍数贡献一个 5, [N/5^2]表示不大于 N 的数中, 5^2 再贡献一个52. 但第一题有一个可以优化的地方, 因为 b >= 1; ret +=... 阅读全文
摘要:
singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例.解法1. 能在多线程中工作但效率不高public sealed class Singleton2 { private Singleton2() { } private static readonly object synObj = new object(); private static Singleton2 instance = NULL; public static Singleton2 instance { get{ lock(synObj) { ... 阅读全文
摘要:
要求为类 CMyString 定义赋值运算符函数.类的定义如下class CMyString {public: CMyString(char* pData = NULL; ) CMyString(const CMyString &str); ~CMyString(void);private: char* m_pData;}; 在定义一个赋值运算符时, 需要考虑如下几点1. 需要把返回值得类型声明定义为该类型的引用, 并且在函数结束前返回实例自身的引用 (*this). 只有返回引用才可以连续赋值2. 需要把传入参数的类型声明为常量引用. 形参必须是引用, 否则会编译报错3. 需要判断引 阅读全文
摘要:
总结1. Leetcode 上有一道题, 是不用乘除做乘法, 那道题算是背包问题的变形2. 不用加减乘除, 还可以用移位操作3. 将数字转成二进制格式, 然后运用二进制亦或, 移位运算解决 3.1 仅考虑各位相加, 不考虑进位, num1 ^ num2 3.2 仅考虑进位, (num1 & num2) using namespace std;int Add(int num1, int num2) { int sum, carry; do { sum = num1 ^ num2; carry = (num1 & num2) << 1; num1 = sum; num2 阅读全文
摘要:
题目要求不能使用乘除法, for, while, if else, switch, case 等关键字思路1. 循环已经命令禁止, 禁用 if, 意味着递归也不能使用. 但即便如此, 我们仍然要围绕循环或递归作文章2. 利用构造函数求解#include using namespace std;class Temp {public: Temp() { ++ N; Sum += N; cout using namespace std;class A;A *arr[2];class A {public: virtual unsigned int Sum(unsigned int n) { ... 阅读全文
摘要:
题目从扑克牌中任意抽取出 5 张牌, 判断是不是顺子, 并且大小王可以看成任意的数字思路1. 把大小王当做 0 插入到数组中, 然后对数组排序2. 统计相邻两个数之间的空隙数, 若空隙数大于 0 的个数, 那么不能成为顺子 阅读全文
摘要:
题目把 n 个骰子扔到地上, 所有骰子朝上一面的点数之和为 s. 输入 n, 打印出 s 所有可能的值出现的概率.思路1. 基于递归的求解方法. 深度为 n 的 dfs, 相当于求全排列, 时间效率太低2. 基于循环的实现, 有动态规划的思想在里面. dp[n][i] 表示 n 个骰子时, 出现和为 i 的个数. 那么状态转移方程变成 dp[n+1][i] = dp[n+1][i-1]+...dp[n+1][i-6]总结1. 有必要把之前做过的 poj 题目再重新搞一遍, 动规题目的 dp 数组设置方法需要重新回顾 阅读全文
摘要:
总结1. 题目为归并排序的变形, 不过我完全没想到2. 在归并排序进行字符组 merge 时, 统计逆序数. merge 后, 两个子数组是有序的了, 下次再 merge 的时候就能以 o(n) 的时间内找到某一个逆序对第二个元素的个数 阅读全文