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:递归。根据下一个字符是否是'*'分情况判断。

  1. 如果p的下一个字符不是'*',只需判断当前字符是否相等,或者p[cur]='.',递归处理s[1]和p[1];
  2. 如果是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题解(三)的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  3. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  4. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  5. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  6. [LeetCode 题解] Search in Rotated Sorted Array

    前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...

  7. 【LeetCode题解】136_只出现一次的数字

    目录 [LeetCode题解]136_只出现一次的数字 描述 方法一:列表操作 思路 Java 实现 Python 实现 方法二:哈希表 思路 Java 实现 Python 实现 方法三:数学运算 思 ...

  8. 【LeetCode题解】349_两个数组的交集

    目录 [LeetCode题解]349_两个数组的交集 描述 方法一:两个哈希表 Java 实现 类似的 Java 实现 Python 实现 类似的 Python 实现 方法二:双指针 Java 实现 ...

  9. [LeetCode 题解]:Swap Nodes in Pairs

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  10. [LeetCode 题解]: Roman to Interger

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a ro ...

随机推荐

  1. Java开发规范总结(两周至少看一次)

     Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...

  2. 简易RPC框架-心跳与重连机制

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. 实例说明MVC,MVP,MVVM架构

    很早就知道有这三个概念,但是一直都不清楚是怎么回事,在网上搜索,都是泛泛而谈,没有具体例子,新手是看不懂的,直到找到这篇文章,我对这三个架构有了更清楚的了解. 从一个简单的例子去研究这三个架构. 注意 ...

  4. Eight hdu 1043 八数码问题 双搜

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. IE兼容

    这个基本知识http://www.cnblogs.com/yoosou/archive/2012/07/27/2612443.html 参考: http://www.cnblogs.com/cocow ...

  6. OpenVPN CentOS7 安装部署配置详解

    一 .概念相关 1.vpn 介绍 vpn 虚拟专用网络,是依靠isp和其他的nsp,在公共网络中建立专用的数据通信网络的技术.在vpn中任意两点之间的链接并没有传统的专网所需的端到端的物理链路,而是利 ...

  7. JavaScript 版数据结构与算法(四)集合

    今天,我们要讲的是数据结构与算法中的集合. 集合简介 什么是集合?与栈.队列.链表这些顺序数据结构不同,集合是一种无序且唯一的数据结构.集合有什么用?在 Python 中,我经常使用集合来给数组去重: ...

  8. SerialPort如何读取串口数据并显示在TextBox上,多线程委托

    namespace SerialPort { public partial class Form3 : Form { delegate void UpdateTextEventHandler(stri ...

  9. 玩转INotifyPropertyChanged和ObservableCollection

    转载:   http://www.cnblogs.com/Jax/archive/2009/10/13/1582128.html 本文的代码都是基于WPF的,对于Silverlight,这些技术也同样 ...

  10. haproxy + keepalived 实现网站高可靠

    haproxy 1的配置文件,包括 keepalived 和 haproxy 的配置,分别如下: [haproxy 1的keepalived 配置文件]  /etc/keepalived/keepal ...