链接:
2748. 美丽下标对的数目
**废话:**彩笔做题家回归,要开始找工作噜
题意
在数组里,按i<j
规则取两个数字nums[i]和nums[j]
,只要nums[i]
的第一位数字和nums[j]
的最后一位数字互质,则结果加一
解:
第一眼肯定暴力啊,写了一下随便交交,连WA两发,寄,再看了一下案例,原来是第一位和最后一位,光速修改AC
然后优化,乱搞一通直接负优化,老老实实去看大佬代码,前面的数字只有第一位的数值(大小0-9)有用且具体位置我们并不关心,所以只需要遍历一遍nums
,同时记录前面所有0-9的数量,并计算结果即可
实际代码:
#include<bits/stdc++.h>
using namespace std;
int getFirst(int a) //取首位
{while(a>9){a/=10;}return a;
}
int getEnd(int a) //取尾数
{return a%10;
}
int gcd(int a,int b) //辗转相除取公因数
{if(b>a) swap(a,b);if(a%b==0) return b;return gcd(b,a%b);
}
int countBeautifulPairs(vector<int>& nums)
{int size=nums.size(),ans=0;//vector<int>cnt(13,0);int cnt[10]={0};for(int i=0;i<size;i++){for(int j=1;j<10;j++){if( cnt[j]&& gcd(j,nums[i]%10) ==1 ) ans+=cnt[j];//TestOut: if( gcd( getFirst(nums[i]) , getEnd(nums[j]) ) ==1 ) cout<<getFirst(nums[i])<<" "<<getEnd(nums[j])<<endl;}cnt[getFirst(nums[i])]++;}return ans;
}
int main()
{vector<int> nums;int n;while(cin>>n){nums.push_back(n);}int ans=countBeautifulPairs(nums);cout<<ans<<endl;return 0;
}
限制:
2 <= nums.length <= 100
1 <= nums[i] <= 9999
nums[i] % 10 != 0