剑指Offer(数据结构与算法面试题精讲)C++版——day1

剑指Offer(数据结构与算法面试题精讲)C++版

      • 题目一:整数除法
      • 题目二:二进制加法
      • 题目三:前n个数字二进制形式中1的个数

题目一:整数除法

剑指Offer(数据结构与算法面试题精讲)C++版——day1_第1张图片

    解法1:暴力法,直接连减:

#include 
using namespace std;
int devide(int dividend,int divisor) {
   
	int result=0;
	//注意这里的存在溢出,整数范围:-2^31-2^31-1
	if(dividend==0x80000000&&divisor==-1) {
   
		return INT_MAX;
	}
	while(dividend>divisor) {
   
		dividend-=divisor;
		result++;
	}
	return result;
}
int main() {
   
	cout<<devide(15,2);
}

    对解法1进行复杂度分析,在最坏情况下,需要进行 n 次减法操作,因此时间复杂度为O(n),对于空间复杂度,这里只需要使用到一些临时变量,因此空间复杂度为O(1)。
    解法2:仿二分法,每次找2倍乘最接近于被除数的数,然后减去该数:

#include 
using namespace std;
int devide(int dividend,int divisor) {
   
	const int low_limit=0xc0000000,high_limit=0x40000000;
	int result=0;
	//注意这里的存在溢出,整数范围:-2^31-2^31-1
	if(dividend==INT_MIN&&divisor==-1) {
   
		return INT_MAX;
	}
	while(dividend>=divisor) {
   
		int tmp=divisor;
		int times=1;
		//应满足 tmp>= -2^30,防止tmp+tmp负向溢出 
		//且应满足 tmp<*2^30, 防止tmp+tmp正向溢出 
		while<

你可能感兴趣的:(每天三道算法题,c++,开发语言)