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. jQuery基礎知識

    jQuery基礎知識 $(function(){}) //jQuery先執行一遍再執行其他函數 $(document).ready(fn) //文檔加載完後觸發 1. 刪除$:jQuery.noCon ...

  2. org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML doc

    今天在Spring中换了一种配置bean的方式,发现报错了Unexpected exception parsing XML document from class path resource , 经过 ...

  3. 【京东详情页】——原生js学习之匿名函数

    一.引言 在js模块中,要给每一个功能封装一个匿名函数.为了更好的理解什么是匿名函数,为什么要用匿名函数,我做了一些查阅和学习. 二.匿名函数 什么是:在创建时,不被任何变量引用的函数. 为什么:节约 ...

  4. django之快速分页

    本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在dj ...

  5. 【JVM命令系列】jstat

    命令基本概述 Jstat是JDK自带的一个轻量级小工具.全称"Java Virtual Machine statistics monitoring tool",它位于java的bi ...

  6. Linux视频主要概述

    Linux当中称之为视频的主要为俩个方面(主要以kernel为主): 1.源代码video目录指的是主显示输出,也就是帧缓冲(Frame Buffer)驱动部分,表示对基本图形层的显示支持; 2.源代 ...

  7. 57、Bootstrap中文文档

    给大家介绍一个前端框架让你从此写起前端代码与之先前相比如有神助般的效果拉就是Bootstrap. 一.Bootstrap的下载 Bootstrap,由Twitter的设计师Mark Otto和Jaco ...

  8. Ubuntu 14.04 安装 Sublime Text 3

    1. 实验环境 Ubuntu 14.04 + Sublime text 3 2. sublime text介绍 ublime Text 是一款流行的文本编辑器软件,有点类似于TextMate,跨平台, ...

  9. every();some();filter();map();forEach()各自区别:

    every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...

  10. Spring ——依赖注入配置一些知识点

    依赖注入 依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC).从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来 ...