58. 最后一个单词的长度

分析:找最后一个非空格,向前找

  1. int lengthOfLastWord(string s) {
  2. int i = s.find_last_not_of(' ');
  3. int j = i;
  4. for(;j >= ; j--){
  5. if(s[j] == ' ')
  6. break;
  7. }
  8. return i - j;
  9. }

7. 颠倒整数

分析:注意题意,超范围 LL ,结尾去0

  1. int reverse(int x) {
  2. long long res = ;
  3. if(x!=){
  4. while(!x%){
  5. x /= ;
  6. }
  7. }
  8. while(x){
  9. res *= ;
  10. res += x % ;
  11. x /= ;
  12. }
  13. if(res> INT_MAX || res < -INT_MAX){
  14. res = ;
  15. }
  16. return res;
  17. }

13. 罗马数字转整数

分析:罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。

字母对应数字相加,后面字母比前面字母大代表前面字母需要减去

被减的字母最多一个!

  1. int singleCharToInt(char x){
  2. int num = -;
  3. if(x == 'i')
  4. num = ;
  5. else if(x == 'v')
  6. num = ;
  7. else if(x == 'x')
  8. num = ;
  9. else if(x == 'l')
  10. num = ;
  11. else if(x == 'c')
  12. num = ;
  13. else if(x == 'd')
  14. num = ;
  15. else if(x == 'm')
  16. num = ;
  17. return num;
  18. }
  19. int romanToInt(string s) {
  20. int len = s.size();
  21. transform(s.begin(), s.end(), s.begin(), ::tolower);
  22. int res = ;
  23. for(int i=;i<len;i++){
  24. int num=singleCharToInt(s[i]);
  25. if(singleCharToInt(s[i+]) > num){
  26. num=(-)*num;
  27. }
  28. res += num;
  29. }
  30. return res;
  31. }

38. 数数并说

分析:步步迭代

整数字符串转换

  1. string fun(string s){
  2. string tmp = "";
  3. int len = s.size();
  4. int con =;
  5. char t ;
  6. for(int i=;i<len;){
  7. t=s[i++];con = ;
  8. while(s[i] == t){
  9. con++; i++;
  10. }
  11. ostringstream stream;
  12. stream<<con; //n为int类型
  13. tmp =tmp + stream.str();
  14. tmp+=t;
  15. }
  16. return tmp;
  17. }
  18. string countAndSay(int n) {
  19. string s="";
  20. int en = s.size();
  21. int con =;
  22. while(--n){
  23. s=fun(s);
  24. //cout<<s<<endl;
  25. }
  26. return s;
  27. }

67. 二进制求和

分析:对齐,相加,首位进位处理

  1. string addBinary(string a, string b) {
  2. //对齐
  3. int lena = a.size(), lenb = b.size();
  4. int n = abs(lena - lenb);
  5. string tmp(n,'');
  6. if(lena < lenb) { a = tmp + a; }
  7. if(lena > lenb) { b = tmp + b; }
  8. //加法
  9. int len = a.size();
  10. int x = , c = ; // 计算结果,进位标记
  11. for(int i = len - ; i >= ; --i){
  12. x = a[i] - '' + b[i] -'' + c;
  13. if( x > ){
  14. c = ;
  15. x -= ;
  16. }
  17. else{
  18. c = ;
  19. }
  20. a[i] = (char)('' + x );
  21. }
  22. if(c) //首部进位
  23. a = "" + a;
  24. return a;
  25. }

14. 最长公共前缀

分析:拿第一个字符串作为标准,遍历所有字符串,期间不断缩小条件

  1. string longestCommonPrefix(vector<string>& strs) {
  2. int len = strs.size(),lenS = ;
  3. if( == len)
  4. return "";
  5. string s = strs[];
  6. for(int i=; i<len; ++i){
  7. lenS = s.length();
  8. for(int j=; j<lenS; ++j){
  9. if(s[j] != strs[i][j]){
  10. s = s.substr( , j); //对比所有字符串,不断缩减条件
  11. break;
  12. }
  13. }
  14. }
  15. return s;
  16. }

20. 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

括号必须以正确的顺序关闭,"()" 和 "()[]{}" 是有效的但是 "(]" 和 "([)]" 不是。

分析:栈的应用

我用的比较别扭

每次压入一个字符,深入栈内看是否还有配对成功的括号可以弹出

最终所有配对成功的话,栈为空

  1. bool isValid(string s) {
  2. stack<char> stack_tmp;
  3. int len = s.length();
  4. char x,y;
  5. stack_tmp.push(s[]);
  6. for(int i=; i<len; i++){
  7. stack_tmp.push(s[i]);
  8. while(stack_tmp.size()>=){ //要想配对成功,至少有两个
  9. y = stack_tmp.top();
  10. stack_tmp.pop();
  11. x = stack_tmp.top(); //取两数
  12. if(')' == y && x == '('){
  13. stack_tmp.pop();
  14. }
  15. else if('}' == y && x == '{'){
  16. stack_tmp.pop();
  17. }
  18. else if(']' == y && x == '['){
  19. stack_tmp.pop();
  20. }
  21. else{
  22. stack_tmp.push(y); //不行,再压回去
  23. break;
  24. }
  25. }
  26. }
  27. return stack_tmp.empty();
  28. }

29. 两数相除

不使用乘号,除号和取模符号将两数相除。如果溢出返回 MAX_INT。

感谢:https://www.liuchuo.net/archives/3140

  1. //1. 利用 a/b = exp(log(a)-log(b)) //注意定义域>0 需取绝对值,并抽取符号位(抑或运算用的巧妙)
    //2. 注意越界情况,可能分母==0 可能负数反号
    int divide(int dividend, int divisor) {
  2. if(divisor == || dividend == INT_MIN && divisor == -) return INT_MAX; //溢出两种情况
  3. int sign = ((dividend >> ) ^ (divisor >> )) == ? : -; //符号位 判断
  4. long a = abs((long)dividend);
  5. long b = abs((long)divisor);
  6. double c = exp(log(a) - log(b)) + 0.0000000001;
  7. return (int)(sign * c);
  8. }

125. 验证回文字符串

给定一个字符串,确定它是否是回文,只考虑字母数字字符和忽略大小写。

例如:
"A man, a plan, a canal: Panama" 是回文字符串。
"race a car" 不是回文字符串。

注意:
你有考虑过这个字符串可能是空的吗? 在面试中这是一个很好的问题。

针对此题目,我们将空字符串定义为有效的回文字符串。

分析:空串处理、提取主要字符串、双向搜索判断

  1. bool isPalindrome(string s) {
  2. if (""== s) return true; //1. deal with empty string
  3. int len = s.length();
  4. string tmp="";
  5. for(int i=; i <len; i++){ //2. filter string
  6. if(s[i]>='A' &&s[i]<='Z'){
  7. tmp +=s[i] +;
  8. }
  9. if((s[i]>='a'&& s[i]<='z') ||(s[i] >='' &&s[i] <='')){
  10. tmp +=s[i];
  11. }
  12. }
  13. len = tmp.length();
  14. int m = (len +)/;
  15. for (int i=; i <= m; i++) { //3. Bidirectional search
  16. if(tmp[i] != tmp[len -i -])
  17. return false;
  18. }
  19. return true;
  20. }

leetcode 刷题日志 2018-03-26的更多相关文章

  1. leetcode 刷题日志 2018-3-28

    树: 404. 左叶子之和 求所有左叶子结点之和 . 递归法 分析:递归法遍历结点,找左叶子结点 空指针判断 有左子节点?是叶子结点?是的话更新value的值 int sumOfLeftLeaves( ...

  2. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  3. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  4. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制   33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...

  5. C#LeetCode刷题-排序

    排序篇 # 题名 刷题 通过率 难度 56 合并区间   31.2% 中等 57 插入区间   30.4% 困难 75 颜色分类   48.6% 中等 147 对链表进行插入排序   50.7% 中等 ...

  6. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配   17.8% 困难 45 跳跃游戏 II   25.5% 困难 55 跳跃游戏   30.6% 中等 122 买卖股票的最佳时机 II C ...

  7. C#LeetCode刷题-栈

    栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水   35.6% 困难 71 简 ...

  8. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串   22.4% 中等 10 正则表达式匹配   18.8% 困难 32 最长有效括号   23.3% 困难 44 通配符匹配   17.7% ...

  9. C#LeetCode刷题-二分查找​​​​​​​

    二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

随机推荐

  1. Team Work总结 && OPP课程总结

    团队作业总结 工作总结 本次大作业我在团队内的工作是:根据框架构建实现建筑类的功能,包括防御塔.水晶.泉水等建筑.根据架构框架以及结合各建筑的特点,利用继承和多态很快速的解决了一些基本的问题.然而在实 ...

  2. CDOJ ABCDE dp(前缀和优化)

    题目链接: http://acm.uestc.edu.cn/#/problem/show/1307 ABCDE Time Limit: 1000/1000MS (Java/Others)Memory ...

  3. 引用百度bcebos jar 503问题

    最近使用jeecms管理公司各个站点,关于附件部分采用bos进行上传处理. 在引用bosjar的时候,出现503问题,打断点打印异常堆栈信息,也获取不到.后来使用watch,发现BosClientCo ...

  4. iOS- Swift:如何使用iOS8中的UIAlertController

    1.前言 在前段时间手机QQ:升级iOS8.3后,发图就崩的情况, 就是因为iOS8更新UIAlertController后,仍然使用UIAlertview导致的 具体原因分析 这个可以看腾讯团队发出 ...

  5. erlang中检查内存泄露

    最近项目内存占用过多,检查一下erlang的内存使用情况. 1. 通过etop可以很方便得出erlang内存使用的情况 spawn(fun() -> etop:start([{output, t ...

  6. jQuery之css

    设置css样式/读取css值 css() 1. 得到第一个p标签的颜色 2. 设置所有p标签的文本颜色为red 3. 设置第2个p的字体颜色(#ff0011),背景(blue),宽(300px), 高 ...

  7. win7 64位机ODBC的数据源DSN添加和移除问题

    64位机器上ODBC的操作方法与32位机器是不一样的,如果直接从控制面板上-管理员工具-ODBC进去的话会发现User DSN以及System DSN里面都为空,ADD的时候连ODBC Driver都 ...

  8. windows远程连接设置

    1.设置整个服务器只允许一个连接. 使用组策略管理gpedit.msc, 计算机配置>管理模板>windows组件 >终端服务>限制连接数量,设为已启动,数量设置为1. 此设置 ...

  9. 'phantomjs.exe' executable needs to be in PATH. (selenium PhantomJS python)

    今天selenium PhantomJS python用了下,发现报错,提示我:'phantomjs.exe' executable needs to be in PATH. from seleniu ...

  10. 【Python】Python 猜年龄的游戏

    游戏规则: 允许用户最多尝试3次 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 如何猜对了,就直接退出 age= cou ...