leetcode 刷题日志 2018-03-26
58. 最后一个单词的长度
分析:找最后一个非空格,向前找
- int lengthOfLastWord(string s) {
- int i = s.find_last_not_of(' ');
- int j = i;
- for(;j >= ; j--){
- if(s[j] == ' ')
- break;
- }
- return i - j;
- }
7. 颠倒整数
分析:注意题意,超范围 LL ,结尾去0
- int reverse(int x) {
- long long res = ;
- if(x!=){
- while(!x%){
- x /= ;
- }
- }
- while(x){
- res *= ;
- res += x % ;
- x /= ;
- }
- if(res> INT_MAX || res < -INT_MAX){
- res = ;
- }
- return res;
- }
13. 罗马数字转整数
分析:罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。
字母对应数字相加,后面字母比前面字母大代表前面字母需要减去
被减的字母最多一个!
- int singleCharToInt(char x){
- int num = -;
- if(x == 'i')
- num = ;
- else if(x == 'v')
- num = ;
- else if(x == 'x')
- num = ;
- else if(x == 'l')
- num = ;
- else if(x == 'c')
- num = ;
- else if(x == 'd')
- num = ;
- else if(x == 'm')
- num = ;
- return num;
- }
- int romanToInt(string s) {
- int len = s.size();
- transform(s.begin(), s.end(), s.begin(), ::tolower);
- int res = ;
- for(int i=;i<len;i++){
- int num=singleCharToInt(s[i]);
- if(singleCharToInt(s[i+]) > num){
- num=(-)*num;
- }
- res += num;
- }
- return res;
- }
38. 数数并说
分析:步步迭代
整数字符串转换
- string fun(string s){
- string tmp = "";
- int len = s.size();
- int con =;
- char t ;
- for(int i=;i<len;){
- t=s[i++];con = ;
- while(s[i] == t){
- con++; i++;
- }
- ostringstream stream;
- stream<<con; //n为int类型
- tmp =tmp + stream.str();
- tmp+=t;
- }
- return tmp;
- }
- string countAndSay(int n) {
- string s="";
- int en = s.size();
- int con =;
- while(--n){
- s=fun(s);
- //cout<<s<<endl;
- }
- return s;
- }
67. 二进制求和
分析:对齐,相加,首位进位处理
- string addBinary(string a, string b) {
- //对齐
- int lena = a.size(), lenb = b.size();
- int n = abs(lena - lenb);
- string tmp(n,'');
- if(lena < lenb) { a = tmp + a; }
- if(lena > lenb) { b = tmp + b; }
- //加法
- int len = a.size();
- int x = , c = ; // 计算结果,进位标记
- for(int i = len - ; i >= ; --i){
- x = a[i] - '' + b[i] -'' + c;
- if( x > ){
- c = ;
- x -= ;
- }
- else{
- c = ;
- }
- a[i] = (char)('' + x );
- }
- if(c) //首部进位
- a = "" + a;
- return a;
- }
14. 最长公共前缀
分析:拿第一个字符串作为标准,遍历所有字符串,期间不断缩小条件
- string longestCommonPrefix(vector<string>& strs) {
- int len = strs.size(),lenS = ;
- if( == len)
- return "";
- string s = strs[];
- for(int i=; i<len; ++i){
- lenS = s.length();
- for(int j=; j<lenS; ++j){
- if(s[j] != strs[i][j]){
- s = s.substr( , j); //对比所有字符串,不断缩减条件
- break;
- }
- }
- }
- return s;
- }
20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
括号必须以正确的顺序关闭,"()"
和 "()[]{}"
是有效的但是 "(]"
和 "([)]"
不是。
分析:栈的应用
我用的比较别扭
每次压入一个字符,深入栈内看是否还有配对成功的括号可以弹出
最终所有配对成功的话,栈为空
- bool isValid(string s) {
- stack<char> stack_tmp;
- int len = s.length();
- char x,y;
- stack_tmp.push(s[]);
- for(int i=; i<len; i++){
- stack_tmp.push(s[i]);
- while(stack_tmp.size()>=){ //要想配对成功,至少有两个
- y = stack_tmp.top();
- stack_tmp.pop();
- x = stack_tmp.top(); //取两数
- if(')' == y && x == '('){
- stack_tmp.pop();
- }
- else if('}' == y && x == '{'){
- stack_tmp.pop();
- }
- else if(']' == y && x == '['){
- stack_tmp.pop();
- }
- else{
- stack_tmp.push(y); //不行,再压回去
- break;
- }
- }
- }
- return stack_tmp.empty();
- }
29. 两数相除
不使用乘号,除号和取模符号将两数相除。如果溢出返回 MAX_INT。
感谢:https://www.liuchuo.net/archives/3140
- //1. 利用 a/b = exp(log(a)-log(b)) //注意定义域>0 需取绝对值,并抽取符号位(抑或运算用的巧妙)
//2. 注意越界情况,可能分母==0 可能负数反号
int divide(int dividend, int divisor) {- if(divisor == || dividend == INT_MIN && divisor == -) return INT_MAX; //溢出两种情况
- int sign = ((dividend >> ) ^ (divisor >> )) == ? : -; //符号位 判断
- long a = abs((long)dividend);
- long b = abs((long)divisor);
- double c = exp(log(a) - log(b)) + 0.0000000001;
- return (int)(sign * c);
- }
125. 验证回文字符串
给定一个字符串,确定它是否是回文,只考虑字母数字字符和忽略大小写。
例如:"A man, a plan, a canal: Panama"
是回文字符串。"race a car"
不是回文字符串。
注意:
你有考虑过这个字符串可能是空的吗? 在面试中这是一个很好的问题。
针对此题目,我们将空字符串定义为有效的回文字符串。
分析:空串处理、提取主要字符串、双向搜索判断
- bool isPalindrome(string s) {
- if (""== s) return true; //1. deal with empty string
- int len = s.length();
- string tmp="";
- for(int i=; i <len; i++){ //2. filter string
- if(s[i]>='A' &&s[i]<='Z'){
- tmp +=s[i] +;
- }
- if((s[i]>='a'&& s[i]<='z') ||(s[i] >='' &&s[i] <='')){
- tmp +=s[i];
- }
- }
- len = tmp.length();
- int m = (len +)/;
- for (int i=; i <= m; i++) { //3. Bidirectional search
- if(tmp[i] != tmp[len -i -])
- return false;
- }
- return true;
- }
leetcode 刷题日志 2018-03-26的更多相关文章
- leetcode 刷题日志 2018-3-28
树: 404. 左叶子之和 求所有左叶子结点之和 . 递归法 分析:递归法遍历结点,找左叶子结点 空指针判断 有左子节点?是叶子结点?是的话更新value的值 int sumOfLeftLeaves( ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- C#LeetCode刷题-设计
设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...
- C#LeetCode刷题-排序
排序篇 # 题名 刷题 通过率 难度 56 合并区间 31.2% 中等 57 插入区间 30.4% 困难 75 颜色分类 48.6% 中等 147 对链表进行插入排序 50.7% 中等 ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
- C#LeetCode刷题-栈
栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水 35.6% 困难 71 简 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- C#LeetCode刷题-二分查找
二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
随机推荐
- Team Work总结 && OPP课程总结
团队作业总结 工作总结 本次大作业我在团队内的工作是:根据框架构建实现建筑类的功能,包括防御塔.水晶.泉水等建筑.根据架构框架以及结合各建筑的特点,利用继承和多态很快速的解决了一些基本的问题.然而在实 ...
- CDOJ ABCDE dp(前缀和优化)
题目链接: http://acm.uestc.edu.cn/#/problem/show/1307 ABCDE Time Limit: 1000/1000MS (Java/Others)Memory ...
- 引用百度bcebos jar 503问题
最近使用jeecms管理公司各个站点,关于附件部分采用bos进行上传处理. 在引用bosjar的时候,出现503问题,打断点打印异常堆栈信息,也获取不到.后来使用watch,发现BosClientCo ...
- iOS- Swift:如何使用iOS8中的UIAlertController
1.前言 在前段时间手机QQ:升级iOS8.3后,发图就崩的情况, 就是因为iOS8更新UIAlertController后,仍然使用UIAlertview导致的 具体原因分析 这个可以看腾讯团队发出 ...
- erlang中检查内存泄露
最近项目内存占用过多,检查一下erlang的内存使用情况. 1. 通过etop可以很方便得出erlang内存使用的情况 spawn(fun() -> etop:start([{output, t ...
- jQuery之css
设置css样式/读取css值 css() 1. 得到第一个p标签的颜色 2. 设置所有p标签的文本颜色为red 3. 设置第2个p的字体颜色(#ff0011),背景(blue),宽(300px), 高 ...
- win7 64位机ODBC的数据源DSN添加和移除问题
64位机器上ODBC的操作方法与32位机器是不一样的,如果直接从控制面板上-管理员工具-ODBC进去的话会发现User DSN以及System DSN里面都为空,ADD的时候连ODBC Driver都 ...
- windows远程连接设置
1.设置整个服务器只允许一个连接. 使用组策略管理gpedit.msc, 计算机配置>管理模板>windows组件 >终端服务>限制连接数量,设为已启动,数量设置为1. 此设置 ...
- 'phantomjs.exe' executable needs to be in PATH. (selenium PhantomJS python)
今天selenium PhantomJS python用了下,发现报错,提示我:'phantomjs.exe' executable needs to be in PATH. from seleniu ...
- 【Python】Python 猜年龄的游戏
游戏规则: 允许用户最多尝试3次 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 如何猜对了,就直接退出 age= cou ...