2022/1/16笔记

#include<iostream>
using namespace std;
int main()
{
int p[3][5];
int len=sizeof(p)/sizeof(int);
int len2=sizeof(p[0])/sizeof(int);
int len3=len/len2;
printf("数组的第一维长度是 %d,第二维长度是 %d\n",len3,len2);
return 0;
}

数组的第一维长度是 3,第二维长度是 5

题目1二分查找课程列表_牛客网 (nowcoder.com)

#include<iostream>
#include<vector>
using namespace std;
int my_fun(vector<int> arr,int res)   //大于等于最左端
{
    int left=0,right=arr.size()-1;
    while(left<=right)
    {
        int mid=left+((right-left)>>1);//注意括号
        if(res>arr[mid]) left=mid+1;
        else right =mid-1;
    }
    if(left==arr.size()) return arr.size()+1;
    return left+1;
}
int main()
{
    int len,res;
    cin>>len>>res;
    vector<int> arr(len);
    for(int &a:arr)
        cin>>a;
    cout<<my_fun(arr,res);
    return 0;
}

常用二分

#include <iostream>
#include <vector>
using namespace std;
//二分查找1.最左边的第一位
int FristBinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]<target) left=mid+1;
		else right=mid-1;
	}
	if(nums[left]!=target||left==nums.size()) return -1;//主要是先后顺序,否则找不到值 
	return left;
}
//二分查找4.大于等于的第一位
int FristBinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]<target) left=mid+1;
		else right=mid-1;
	}
	if(left==nums.size()) return -1;//主要是先后顺序,否则找不到值 
	return left;
}
//二分查找2.最右边的第一位
int LastBinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]>target) right=mid-1;
		else left=mid+1;
	}
	if(right<0||nums[right]!=target) return-1;
	return right;
}
//最基本的二分查找无法确定找到的是哪一个最先找到的输出
int BinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]==target) return mid;
		else if(nums[mid]>target) right=mid-1;
		else left=mid+1;
	}
	return -1;
}
int main(){
	int a = FristBinarySearch({1,2,3,3,3},3);
	int b = LastBinarySearch({1,2,3,3,3},3);
	int c = BinarySearch({1,2,3,3,3,4,4},3);
	cout<<a<<endl<<b<<endl<<c<<endl;
}

数组中只出现一次的两个数字_牛客题霸_牛客网 (nowcoder.com)题目2异或运算数组中只出现一次的两个数字_牛客题霸_牛客网 (nowcoder.com)

class Solution {
public:
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        int cor=0,cor1=0,cor2=0;
        vector<int> res;
        for(int a:array)
            cor^=a;
        int lastone=cor&(~cor+1);                //取最右边的1
        for(int b:array)
            if((b&lastone)==0) cor1^=b;          //碰见位运算、逻辑运算注意运算符优先级加()
        cor2=cor^cor1;
        if(cor1>cor2){
            my_swap(cor1,cor2);
        }
        res.push_back(cor1);
        res.push_back(cor2);
        return res;
    }
    void my_swap(int &a,int &b)                    //用引用。异或实现交换aba
    {
        a=a^b;
        b=a^b;
        a=a^b;
    }
};

题目3异或变加

说明:^就是无进位加法,进位看出&后左移一位,两者相加递归。

class Solution {
public:
    int Add(int num1, int num2) {
        while(num2 !=0){                  //递归结束条件
            int c = (num1 & num2) << 1;
            num1 ^=num2;
            num2 = c;
            
    }
        return num1;
    }
};

 题目4二进制最右边的1

二进制中1的个数_牛客题霸_牛客网 (nowcoder.com)

class Solution {            //每次去掉最右边的一个1
public:
     int  NumberOf1(int n) {
         int res=0;
         int b=1;
         while(n!=0)
         {   res++;
             n=n&(n-1);//去掉最后一位1一定用减
         }
         return res;
    }};

题目5

知识点:短路求值

  1. (a=0)&&(b=4);从左到右判断、逻辑与:左边有0不执行右边。非零都按照1

  2. (a=1)||(b=4);从左到右判断、逻辑或:左边有1不执行右边。非1都看成0

  3. (A)&&(B)当A部分不成立,则B部分不会执行,(A)||(B)当A部分成立,则B部分不会执行

    class Solution {
    public:
        int Sum_Solution(int n) {
            n && (n += Sum_Solution(n-1));
            //或者(n!=0) && (n += Sum_Solution(n-1));
            //或者(n==0) || (n = n+Sum_Solution(n-1));
    
            return n;
        }
    };
    
    

sizeof()各种类型汇总

 sizeof(char)  // 1  一般都以这个为基础,为最小的单位,其值为1,其他的sizeof()类型都是以这个为倍数

sizeof(bool) //  1

sizeof(int)  //  4

sizeof(long)  = sizeof(long int)  // 4  早年的时候是16位的,int为2,long为4;后来电脑升到32位, int和long都是一样的了为4;不过后来又有64位的,有的可能是int是4,long是8。这个需要的查看自己的电脑的是啥情况。

sizeof(short)  // 2

sizeof(int*) == sizeof(char*)  // 4

sizeof(float)  // 4

sizeof(double)  // 8

sizeof(long double)  // 8

class Solution {
public:
    int Sum_Solution(int n) {
    char a[n][n+1];
        return sizeof(a)>>1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值