A 美丽下标对的数目
暴力
class Solution {
public:
int countBeautifulPairs(vector<int>& nums) {
int n=nums.size();
int cnt=0;
function<int(int,int)> gcd=[&](int a,int b)->int{
return !b?a:gcd(b,a%b);
};
for(int i=0;i<n;i++){
int s=nums[i];
while(s>=10){
s/=10;
}
for(int j=i+1;j<n;j++){
if(gcd(s,nums[j]%10)==1){
cnt++;
}
}
}
return cnt;
}
};
B 得到整数零需要执行的最少操作数
首先考虑每次减 i 次的数 是否在规定步数 二进制中一的个数是否小于步数 而且需要提前判断当a-b之后a是否已经小于步数零 如果小于了 说明这个数是不可能成功的
class Solution {
public:
int makeTheIntegerZero(int num1, int num2) {
if(num2>=num1)return -1;
long long a=num1,b=num2;
for(int i=1;i<60;i++){
a-=b;
int cnt=0;
if(a<=0)return -1;
if(a<i)return -1;
for(int j=0;j<60;j++){
if(a>>j&1)cnt++;
}
if(cnt<=i)return i;
}
return -1;
}
};
C 2750. 将数组划分成若干好子数组的方式
就是两个1之间的0的个数+1 相乘 数学题
class Solution {
public:
int numberOfGoodSubarraySplits(vector<int>& nums) {
const int N=1e9+7;
int ans=1,pre=-1;
for(int i=0;i<nums.size();i++){
if(nums[i]==0)continue;
if(pre>=0)ans=(long long )ans*(i-pre)%N;
pre=i;
}
return pre<0?0:ans;
}
};
D 机器人碰撞
利用结构体按照从左到右的position排序 这样排序完成后,用栈把往右边走的存入 如果遇见往左边走的就进行减少,就行了,然后再根据id排序输出
struct ta{
int id,po,hs;
char ch;
};
bool cmp(ta a,ta b){
return a.po<b.po;
}
bool cmp1(ta a, ta b){
return a.id<b.id;
}
class Solution {
public:
vector<int> survivedRobotsHealths(vector<int>& positions, vector<int>& healths, string directions) {
int n=positions.size();
vector<ta>v,tt;
for(int i=0;i<n;i++){
v.push_back({i+1,positions[i],healths[i],directions[i]});
}
sort(v.begin(),v.end(),cmp);
stack<ta> st;
for(int i=0;i<n;i++){
while(st.size() && v[i].ch=='L'&&v[i].hs>0){
if(v[i].hs>st.top().hs){
st.pop();
v[i].hs--;
}
else if(v[i].hs==st.top().hs){
st.pop();
v[i].hs=0;
}
else {
st.top().hs--;
v[i].hs=0;
}
}
if(v[i].ch=='R')st.push(v[i]);
if(st.size()==0 &&v[i].ch=='L' && v[i].hs!=0)tt.push_back(v[i]);
}
while(st.size()){
tt.push_back(st.top());
st.pop();
}
sort(tt.begin(),tt.end(),cmp1);
vector<int> ts;
for(auto x:tt){
ts.push_back(x.hs);
}
return ts;
}
};