链接:
**废话:**彩笔做题家回归,要开始找工作噜
题意
在数组里,按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