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. 详细解读-this-关键字在全局、函数、对象、jQuery中的基础用法!

    一.前言 1. Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其 ...

  2. Select()使用否?

    David Treadwell ,Windows Socket 的一位开发者,曾经在他的一篇名为"Developing Transport-Independent Applications ...

  3. End up with More Teams UVA - 11088

    End up with More Teams Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu ...

  4. Finding LCM (最小公倍数)

    Finding LCM Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu [Submit]   ...

  5. Easyui后台管理角色权限控制

    最近需要做一个粗略的后台管理的权限,根据用户的等级来加载相应的菜单,控制到子菜单.使用的是Easyui这个框架. 1.我使用的mysql数据库.在这里我就建立四张表,角色表(tb_users),菜单表 ...

  6. zoj3961(区间问题)

    点击打开zoj1961Let's Chat Time Limit: 1 Second      Memory Limit:65536 KB ACM (ACMers' Chatting Messenge ...

  7. akka源码导读

    akka的actor模型提供了强大的并发,本人就akka源码进行了详细的阅读,下面是一些体会. 1.object SystemMessageList: @tailrec private[sysmsg] ...

  8. 【特效】页面滚动到相应位置运行css3动画

    请到我的个人博客网站上浏览此文章,欢迎评论和建议. 文章链接:http://www.xiaoxianworld.com/archives/87 现在css3动画很常见了,实际项目中经常应用,特别是那种 ...

  9. Nginx配置文件中文详解

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  10. 多个code.csdn.net账号切换

    code.csdn.net是国内开源库 使用git需要在项目添加密钥 而如果有多个账户,一个是私人,一个是公司,那么这时怎么做? 密钥存在~/.ssh默认是id_rsa 那么一个比较笨的办法是做一个k ...