#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
知识点:短路求值
(a=0)&&(b=4);从左到右判断、逻辑与:左边有0不执行右边。非零都按照1
(a=1)||(b=4);从左到右判断、逻辑或:左边有1不执行右边。非1都看成0
(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; } };