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 ...
随机推荐
- AVL树 算法思想与代码实现
AVL树是高度平衡的二叉搜索树,按照二叉搜索树(Binary Search Tree)的性质,AVL首先要满足: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不为空, ...
- c# 画一个报告
填充控件的grafics属性: private void printReportPage(object sender, System.Drawing.Printing.PrintPageEventAr ...
- SSD/Memory技术学习拼图
"打酱油"解读SLC缓存新技术[http://www.pceva.com.cn/article/3612-1.html] 固态硬盘主控将消亡?未来高性能固态硬盘长这样[http:/ ...
- HDU 5391Z ball in Tina Town 数论
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5391 bc: http://bestcoder.hdu.edu.cn/contests/c ...
- 如何解决Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]
APP改版测试后准备Archive发布时,结果居然出现题目中的错误提示.查了一下,如果archive的时候没有选[iOS](http://lib.csdn.net/base/ios) Devices ...
- 【leetcode】215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 使用java程序模拟页面发送http的post请求
在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下: import java.io.BufferedReader; import ja ...
- 出现脚本错误或者未正确调用 Page()
pages/xxxx/xxxx.js 出现脚本错误或者未正确调用 Page() 自己创建的小程序出现上面报错,可能是因为 xxxx.js是一个空文件,所以才会出现未正确调用: 如果是空文件的话,解决办 ...
- HDU3507_Print Article
这个题目又是一个典型的dp斜率优化的题目.题意是给你n个数,你需要做的是把这个n个数分为连续的若干段,每段的权值为这段数字的和的平方加上M.求最小的总权值. 我们可以根据题意写出朴素版的dp状态转移方 ...
- P4623 [COCI2012-2013#6] BUREK
题目描述 给定N个三角形,和M条直线,直线要么平行于X轴,要么平行于Y轴,问这M条直线 分别经过多少个三角形内部 (注意是内部即分开的两个多边形的面积均大于零). 输入输出格式 输入格式: 第一行一个 ...