Leetcode题解(三)
8、String to Integer (atoi)
题目

这道题目关键是要考虑清楚各种输入用例。针对每一种情况,函数都能处理,也就是函数鲁棒性很高。代码如下:
class Solution {
public:
int myAtoi(string str) {
int index=;
int flag = ;
long long res=;
if(str.length()==)return ;
while (str[index]==' ')//去除空白
index++;
if(str[index] == '-')//负数
{
flag = -;
index++;
}
else if(str[index] == '+')//负数
{
flag = ;
index++;
}
int len = str.length();
while (str[index]>=''&&str[index]<='')
{
res = res * +str[index]-'';
if(res > INT_MAX)
return flag> ? INT_MAX:INT_MIN;
index++;
}
return res*flag;
}
};
----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------
9、Palindrome Number
题目

话不多说,直接看代码:
class Solution {
public:
bool isPalindrome(int x) {
if (x == -)
{
return false;
}
if (x<)
{
//x=0-x;
return false;
}
int length = (int)log10(x*1.0)+;//判断x的位数
//int s[20];
int temp1 = x;
int temp2 = x;
int middle = length/;
int i,j,left,right,power=length-;
for (i=;i<=middle;i++)
{
left=temp1/(int)pow(10.0,power);
temp1=temp1%(int)pow(10.0,power);
power--;
right = temp2%;
temp2 = temp2/;
if (left != right)
{
return false;
}
}
return true;
}
};
--------------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------
10、Regular Expression Matching
题目

这道题目,一开始我以为要用到编译原理里面学到的自动机构造方法,后来在网上看别人的解题思路,其实可以采用递归的方法直接进行匹配,其思路是这样的;
思路1:递归。根据下一个字符是否是'*'分情况判断。
- 如果p的下一个字符不是'*',只需判断当前字符是否相等,或者p[cur]='.',递归处理s[1]和p[1];
- 如果是p的下一个'*',则当前s和p相等或者p='.'情况下,依次判断s[0...s.length]和p2]是否match;
实现代码可以参考如下:
class Solution {
public:
bool isMatch(string s, string p) {
return isMatch(s.c_str(),p.c_str());
}
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (*p == ) return *s == ;
if (*(p+) != '*')
{
if (*s != && (*p == *s || *p == '.')) return isMatch(s+, p+);
else return false;
}
else
{
// *s == *p
while (*s != && (*s == *p || *p == '.'))
{
if (isMatch(s, p+)) return true;
s++;
}
return (isMatch(s, p+));
}
}
};
当然,这道题还可以采用自动机进行解决,不过难度也是很大的,需要对模式串进行分析,构造出自动机,然后通过s串逐个字符的匹配。下面是最开始未完成的代码:
class node
{
public:
node()
{
val = ;
self = -;
isEnd = false; }
node(char c)
{
val = c;
self = -;
isEnd = false;
} public:
char val;
int self;//是否包含*
bool isEnd;//是否是终态 }; class Solution {
public:
bool isMatch(string s, string p)
{
if("" == s)
return true;
if("" == p)
return false;
vector<node*> status;//存储自动机状态节点
node *temp; temp = new node(p[]);
status.push_back(temp); int i=;
int index = ;
while (p[i] != '\0')//注意,如果模式是a*aaa最终转换为节点为{a,3,true},true表示当前节点是终态
{
index = status.size();
if(p[i] == '*')
{
if(status[index-]->self != -)//考虑模式中有a*a*这种情况,当处理第二个*时,前一个节点的self不为-1
status[index-]->self = ;
else
status[index-]->self++;
i++;
continue;
}
if(p[i] == status[index-]->val)
{
status[index-]->self++;
i++;
continue;
}
temp = new node(p[i]);
status.push_back(temp); i++; }
index = status.size();
index--;
//比如a*b*最后做出的两个节点都是终态
status[index]->isEnd = true;//最后一个节点肯定是终态 while (index >= )//判断各个节点是不是终态
{
if(status[index]->self != -)
status[index]->isEnd = true;
else//只要当前不是终态,那它之前的所有节点都不是终态
{
break;
}
index--;
} i=;
index = ;
int nodeCount = status.size(); while(s[i] != '\0')
{
if(index >= nodeCount)
return false;
if(status[index]->val == '.')
{
if(status[index]->self != -)
{
if(status[index]->isEnd)
return true;
else
{ }
}
else
{
i++;
index++;
continue;
}
}
else
{ }
i++;
} }
};
---------------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------
11、Container With Most Water
题目

题目要求:给定n个非负整数,构成n个点,其点坐标为(i,ai),然后过每个点做x轴的垂线,形成n条线段,任意选择两条垂线段作为“容器”,求最大容器的所能容下的水量。
这类求最值的问题,第一想法都是暴利,也就是一次遍历两两线段,求其容器体积,并找出最大值,其代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int count = height.size();
int i,j;
int volumn = ,temp;
for (i = ;i < count;i++)
{
for(j = i+;j < count;j++)
{
temp = height[i] > height [j] ? height[j] : height[i];//取最小值,也就是边矮的
if(volumn < temp * (j-i))
volumn = temp * (j-i);
}
}
return volumn;
}
};
很显然,这中思路的时间复杂度肯定是O(n*n);
仔细一想,这个题目可以采用首尾夹逼的策略进行求解,其代码如下:
class Solution {
public:
int maxArea(vector<int> &height) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int i = ;
int j = height.size() - ;
int ret = ;
while(i < j)
{
int area = (j - i) * min(height[i], height[j]);
ret = max(ret, area);
if (height[i] <= height[j])
i++;
else
j--;
}
return ret;
}
};
Leetcode题解(三)的更多相关文章
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
- [LeetCode 题解] Search in Rotated Sorted Array
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...
- 【LeetCode题解】136_只出现一次的数字
目录 [LeetCode题解]136_只出现一次的数字 描述 方法一:列表操作 思路 Java 实现 Python 实现 方法二:哈希表 思路 Java 实现 Python 实现 方法三:数学运算 思 ...
- 【LeetCode题解】349_两个数组的交集
目录 [LeetCode题解]349_两个数组的交集 描述 方法一:两个哈希表 Java 实现 类似的 Java 实现 Python 实现 类似的 Python 实现 方法二:双指针 Java 实现 ...
- [LeetCode 题解]:Swap Nodes in Pairs
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a li ...
- [LeetCode 题解]: Roman to Interger
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a ro ...
随机推荐
- TCP/IP(四)网络层
前言 前面给大家介绍了计算机网络的基本概述,物理层和数据链路层.这一篇给大家介绍面试中经常会被问到的网络层.在介绍之前我们回顾一下之前学习的知识! CP/IP协议栈:物理层.链路层.网络层.传输层.应 ...
- [ASP.NET教程] 防止表单重复提交
第一种方法:javascript控制.缺点,一般用户使用没问题,但是懂点js的还是可以强行重复提交.而且,后退再提交,你也没啥办法.第二种方法:服务器控制.后台生成一个token,存入session或 ...
- JPEG流封装AVI视频
前言:前几天工作任务,要把JPEG流封装为AVI视频,就找了些AVI文件结构资料和示例代码研究了下,现将学习总结及最终完成的可用代码分享出来,由于本人也是现学现用,如有不恰当或错误之处,欢迎提出! 1 ...
- Power Strings poj2406(神代码)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 29402 Accepted: 12296 D ...
- C# 使用FileUpload控件上传图片,将文件转换成二进制进行存储与读取
状况描述: 需要上传文件,但是不想要保存到实体路径下,便可以用该功能来实现. 效果图: 点击[Upload]按钮,上传文件到数据库: 点击[Preview],预览文件: 具体实现: 前台: <t ...
- 【转】python os.popen 超时问题
python 版本 2.5.4 (在高版本python中提倡使用 subprocess.Popen 取代 os.popen) os.popen 会出现过长时间等待导致阻塞问题, 解决方法如下: [py ...
- Linux-fdisk磁盘分区命令(16)
名称: fdisk 使用: fdisk [块设备磁盘] 说明: 将一个块设备(磁盘)分成若干个块设备(磁盘),并将分区的信息写进分区表. fdisk命令菜单常用参数如下所示: d:(del)删除一个 ...
- 关于安全性问题:(XSS,csrf,cors,jsonp,同源策略)
关于安全性问题:(XSS,csrf,cors,jsonp,同源策略) Ajax 是无需刷新页面就能从服务器获取数据的一种方法.它的核心对象是XHR,同源策略是ajax的一种约束,它为通信设置了相同的协 ...
- asp.net中利用Jquery+Ajax+Json实现无刷新分页(二)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PageTest.aspx.cs ...
- Color Blender---在线渐变色带生成器
Color Blender是一个很有用的在线渐变色带生成器,它可以在两种颜色之间,自动生成过渡色,对网页设计师来说是一个不错的颜色调配工具. Color Blender的使用方法很简单,你只 ...