Leetcode题解(十)
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题解(十)的更多相关文章
- 【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题解】232_用栈实现队列(Implement-Queue-using-Stacks)
		
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
 - 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
		
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
 - 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
 - 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
 - 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
		
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
 - 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
		
目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...
 
随机推荐
- [python学习笔记] 开篇
			
今天开始学习markdown,立贴为证. 平均一天一小时.两个月先学完基础. 所有的帖子只为了学习记录,有不对的请提出,轻吐槽
 - LeetCode解题中位运算的运用
			
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
 - MyBatis框架(三)动态SQL,分页,二进制存入数据库图片
			
一.动态sql语句,分页 1, <if>条件 <if test="key!=null"> 拼接sql语句 </if> 2, <choose ...
 - vue源码学习-vnode的挂载和更新流程
			
概述 本文主要介绍在视图的渲染过程中,Vue 是如何把 vnode 解析并挂载到页面中的.我们通过一个最简单的例子来分析主要流程: <div id="app"> {{s ...
 - 1.Bootstrap-简介
			
1.介绍 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 2.HTML 模板 一个使用了 Boots ...
 - iOS Storyboard约束详解
			
链接:http://www.jianshu.com/p/b88c65ffc3eb 约束,就是指--此处略去1万字--都懂的,就不说了.直接进入实战环节. 本文的控件约束都是围绕着UITableView ...
 - TCP/IP(四)网络层
			
前言 前面给大家介绍了计算机网络的基本概述,物理层和数据链路层.这一篇给大家介绍面试中经常会被问到的网络层.在介绍之前我们回顾一下之前学习的知识! CP/IP协议栈:物理层.链路层.网络层.传输层.应 ...
 - Linux JDK配置
			
第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...
 - PDO浅谈之php连接mysql
			
一.首先我们先说一下什么是pdo? 百科上说 PDO扩展为PHP访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数 ...
 - Slf4j+Log4j日志框架入门
			
(一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...