29、Divide Two Integers

题目

题目要求不用乘除和取模运算,实现两个整数相除;

我的第一想法就是把除法变成减法来做,这也是最初除法的定义,其实现代码如下:

 class Solution {
public:
int divide(int dividend, int divisor) {
if( == divisor)
return dividend;
if (- == divisor)
return -dividend; bool flag = false; if((dividend<&&divisor>))
{
dividend = -dividend;
flag = true;
}
else if(dividend>&&divisor<)
{
divisor = -divisor;
flag = true;
} dividend = abs(dividend);
divisor = abs(divisor); int result = ;
while (dividend >=divisor)
{
dividend -= divisor;
result++;
}
if(flag)
result = - result; return result; }
};

看似没什么问题,但是其效率是不高的,比如被除数很大,而除数很小的时候,while循环会执行很多次,导致其效率不高,因此需要想想其他的办法解决该问题;既然直接做减法会超时,那姑且只能想移位操作了,因为移位操作是比较高效的操作,能够快速得到想要结果。如果是移位操作,应该如何下手呢?任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n,在做除法时,dividend/divisor = num,变换一下就可以写成这样dividend = divisor*(a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n);因此先让divisor左移n位,然后用dividend减去这个数,剩下的结果继续用同样的方法求解n-1,代码如下:

 class Solution {
public:
int divide(int dividend, int divisor) {
// Note: The Solution object is instantiated only once.
long long a = abs((double)dividend);
long long b = abs((double)divisor);
long long res = ;
while(a >= b)
{
long long c = b;
for(int i = ; a >= c; i++, c <<=)
{
a -= c;
res += <<i;
}
} if((dividend ^ divisor) >> )
res = -res;
if(res >= )
return ;
else
return res; }
};

---------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------

30、Substring with Concatenation of All Words

题目:

首先得弄懂题目的意思,这道题看了很久才弄明白题目意思:也就是说,给定一个字符串数组,数组中的字符串不管以什么顺序拼接在一起,得到新的字符串new,然后在s中查找new在s中第一次出现的下标,题目给的例子可以拼接成foobar或者barfoo,然后判断其起始下标分别为9,0;

按照上面说的,可以做n!次拼接,然后通过kmp算法判断在s中出现的下标,但是这种方式的效率太低,得想想其他方法,降低算法时间复杂度;

想了一会,想到了一个解决该问题的方法:依次遍历字符串s,第i(i从0开始)轮遍历时,也就是从s的s[i]开始,依次截取子字符串,截取长度为一个word的长度,然后判断words数组中是否有当前子字符串,如果没有,i++,如果存在,再从i+word.length处截取子字符串,以此类推;再判断子字符串是否存在时,可以通过一个map统计每个word出现的次数,遍历时,出现一个word,则对应次数加1,具体看代码实现:

 class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
int l_size = L.size(); if (l_size <= ) {
return vector<int>();
} vector<int> result;
map<string, int> word_count;
int word_size = L[].size();
int i, j; for (i = ; i < l_size; ++i) {
++word_count[L[i]];
} map<string, int> counting; for (i = ; i <= (int)S.length() - (l_size * word_size); ++i) {
counting.clear(); for (j = ; j < l_size; ++j) {
string word = S.substr(i + j * word_size, word_size); if (word_count.find(word) != word_count.end()) {
++counting[word]; if (counting[word] > word_count[word]) {
break;
}
}
else {
break;
}
} if (j == l_size) {
result.push_back(i);
}
} return result;
}
};

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题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  6. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  7. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  8. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

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

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

  10. 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)

    目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...

随机推荐

  1. Spring+SpringMVC+MyBatis整合进阶篇(四)RESTful实战(前端代码修改)

    前言 前文<RESTful API实战笔记(接口设计及Java后端实现)>中介绍了RESTful中后端开发的实现,主要是接口地址修改和返回数据的格式及规范的修改,本文则简单介绍一下,RES ...

  2. 查找Oracle数据库中的重复记录

    本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...

  3. 实例讲解js正则表达式的使用

    前言:正则表达式(regular expression)反反复复学了多次,学了又忘,忘了又学,这次打算把基本的东西都整理出来,加强记忆,也方便下次查询. 学习正则表达式之前首先需要掌握记忆这些基本概念 ...

  4. Racing Car Computer dp

    Racing Car Computer Input: Standard Input Output: Standard Output   The racing cars of today are equ ...

  5. poj3468树状数组的区间更新,区间求和

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47174   ...

  6. Linux查找和筛选工具

    本文为原创文章,转载请标明出处 目录 文件名通配符 单字符匹配元字符 ? 多字符匹配元字符 * 字符范围匹配符 [] 排除范围匹配符 [!] 命令中的正则表达式 单字符匹配符 . 单字符或字符串重复匹 ...

  7. Oracle RAC + ASM + Grid安装

    (一)环境准备 主机操作系统 windows10 虚拟机平台 vmware workstation 12 虚拟机操作系统 redhat 5.5 x86(32位) :Linux.5.5.for.x86. ...

  8. scala 读取文件遇到encode问题(Mac -> remote Linux)

    Source.fromFile(fileName)(enc: Encode),如果遇到错误: java.nio.charset.MalformedInputException: Input lengt ...

  9. windows 本地构建hadoop-spark运行环境(hadoop-2.6, spark2.0)

    下载hadoop http://hadoop.apache.org/releases.html --> http://mirrors.tuna.tsinghua.edu.cn/apache/ha ...

  10. 【转载】小tips: PC端传统网页试试使用Zepto.js进行开发

    Zepto.js设计之初专为移动端,不对一些古董浏览器支持.所以,尺寸很小,压缩后20K多一点,但是,jQuery压缩后,3.*版本要80多K,1.*版本则要90多K,4倍差距. 由于每个页面都会使用 ...