编程题分类——其他算法

前言

正文

1. 大数相加

code

string add(string str_1,string_2)
{
	string result;
	string temp;
	bool carryFlag = false;
	string maxString=(str_1.size()>=str_2.size())?str_1:str_2;//先得到较长,较短字符串的长度
	string minString=(str_1.size()<str_2.size())?str_1:str_2;
	
	//将短字符串补齐到和长字符串一样长,在短字符串前边补上字符0
	int maxLength = maxString.size();
	int minLength = minString.size();
	
	temp.append((maxLength-minLength),'0').append(minString);
	minString.clear();
	minString.append(temp);
	
	//字符串进行倒序遍历,按位相机
	for(int i=(maxString.size()-1);i>=0;i--)
	{
		int res;
		if(carryFlag)//看一下上一位是否有进位,若有进位要进行加一 
			res=(maxString[i]-48)+(minString[i]-48)+1;
		else
			res=(maxString[i]-48)+(minString[i]-48);
			
		if(res<10)//res是否小于10 
			carryFlag = false;
		ese
			carryFlag = true;
		result.push_back((res%10)+48);//然后将当前的这个值存入result之中 
	}	
	
	if(carryFlag)//若最后一位还有进位,那么就直接在该结果上加一
		result.push_back(49);
	reverse(result.begin(),result.end());//接下来,翻转整个数组
	return result;
} 

2. 10亿int型数,统计只出现一次的数

思路
位图法:用bit来标识一个int整数。
分治法:分批处理这10亿的数值。

3. 给定一个无序数组,建一个最大堆。

priority_queue<int,vector>这个是堆的表达式
code

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        //采用最小堆的方式
        vector<int> arr;
        if(input.size()==0||k==0||k>input.size())
            return arr;
        priority_queue<int,vector<int>> que;//实现优先队列的数据结构,底层实现堆实现 priority_queue<Type,Container,Functional> Type为数据类型,Container为保存数据的容器,Functional为元素比较方式,若不写后两个元素,则容器默认是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。
        for(auto x:input)
        {
            if(que.size()<k)
            {
                que.push(x);
            }
            else
            {
                if(x>que.top())
                {
                    que.pop();
                    que.push(x);
                }
            }
        }
        
        while(!que.empty())
        {
            arr.push_back(que.top());
            que.pop();
        }
        return arr;

    }
};

4. 返回峰值

5. 连续子数组的最大和

题目
在这里插入图片描述

code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int s = 0;
        int res = INT_MIN;
        for(auto x:nums)
        {
            if(s<0)//这个的动作就相当于把所有的负数都剔除了。只加正数,可不就得到的就是最大值。
                s = 0;
            s+=x;
            res = max(s,res);
        }
        return res;
    }
};

6. 寻找两个正序数组的中位数

题目
在这里插入图片描述
code

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int size1 = nums1.size();
        int size2 = nums2.size();
        int middle1 = INT_MIN;
        int middle2 = INT_MAX;
        int total = size1+size2;
        int index1 = 0;
        int index2 = 0;
        for(int i = 0;i<=total/2;i++)//error1:<=
        {
            middle1  = middle2;
            if(index2>=size2||(index1<size1&&(nums1[index1]<nums2[index2])))//这里index2>=size2就可以进去了,不然,有可能会走另一条路,导致数组越界
            {
                middle2 = nums1[index1++];
            }
            else
            {
                middle2 =nums2[index2++];
            }
        }
        if(total%2==0)
            return (middle1+middle2)/2.0;//error:这里的2.0表示说精确到小数点后一位,很神
        return middle2;
    }
};

7. 下一个排列

题目
在这里插入图片描述
code

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.size()==0)
            return;
        int len = nums.size();
        for(int i = len-1;i>=0;i--)
        {
            if(i==0)
            {
                sort(nums.begin(),nums.end());
                return;
            }
            else if(nums[i]>nums[i-1])
            {
                //一旦出现后一个数字比前一个大,说明存在更大的证书
                sort(nums.begin()+i,nums.end());
                
                for(int j = i;j<len;j++)
                {
                    //由于从i开始后面已经排序
                    //那么保证获得比nums[i-1]大的数,是[i->len-1]中最小的,交换即可
                    if(nums[j]>nums[i-1])
                    {
                        int temp = nums[i-1];
                        nums[i-1] = nums[j];
                        nums[j] = temp;
                        return ;
                    }
                }
            }
                
        }
    }
};

参考

  1. 剑指Offer
  2. Leetcode 100题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值