偶尔自己会去一些 OJ 网站上找那么几道题目来尝试解答,在 leetcode 看到了一道 largest-number, 感觉并不是很难,这道题也属于 Medium 的级别。自己从数字运算和组合角度尝试去求解,但发现总会发现一些 test cases 无法得到验证,后来看了 github 上牛人公开的代码后,发现就是一个简单的字典排序思想,想想这个:
string a ="9";
string b ="a";
cout<<((a+b) > (b+a))<<endl;
string ab=a+b;//"9a"
string ba=b+a;//"a9"
ab 与 ba 怎么比较大小的,按长度?他们的长度一样,按每个字符的 ascii 码的总和?它们也一样。我也想过如果把两个字符分别化成二进制来看待,有点味道,但是如果字符很长超出了表示范围又怎么解释?最后想想还是 常规的字典排序最符合答案的要求。就像
cpp
3>2>1
c>b>a
cb>ca
a9>9a
当然最好能把 std 的代码看一下,究竟在 ((a+b) > (b+a)) 的过程发生了什么,是怎么比较的?
接着自己又看几道有意思的题目,Single Number 和 Single Numberii
对于第一道用到了 位与 的方法而第二道则是 通过计算所有 位 出现的次数 再把所有的 位 进行 模余 运算来得到最终出现一次的数字。
尽管这些题目自己最终都没能解答出来,但在思考的过程中也得到了锻炼以及对扩大了自己支算法的认识。比如 要获取一个数字的最高位和去掉这个数字的最高位自己想到了通过运算来得到,当然也可以通过转换成字符串然后获取和去掉首个字符来实现,但是自己想的方法可能会高效一点,因为字符串与数字的转换背后本身就需要运算。