int countLargestGroup(int n){
int ret[37]={0};
int sum;
int maxn=0;
int cnt=0;
int temp;
for(int i=1;i<=n;i++)
{
sum=(i/1000%10)+(i/100%10)+(i/10%10)+(i%10);
ret[sum]++;
}
for(int i=0;i<=36;i++)
{
maxn=maxn>ret[i]?maxn:ret[i];
}
for(int i=0;i<=36;i++)
{
if(ret[i]==maxn)
{
cnt++;
}
}
return cnt;
}
思路:for循环遍历,算出每个i的sum,定义辅助数组,使对应的ret[sum]++,最后找ret最大值的个数即可
第二题
n转化为k进制的数,并对输出的数的每一位求和
第三题
思路:二分查找
二分查找要找到目标值与两边元素的关系
如本题,设目标值为x,举例可知,在x的左边,如果num[i]==nums[i+1],那么i是偶数,如果在右边,那么说明是奇数
int singleNonDuplicate(int* nums, int numsSize) {
int low = 0, high = numsSize - 1;
while (low < high) {
int mid = (high - low) / 2 + low;
if (nums[mid] == nums[mid ^ 1]) {
low = mid + 1;
} else {
high = mid;
}
}
return nums[low];
}
第四题
复习一下奇偶排序
第二种解法:双指针
int* exchange(int* nums, int numsSize, int* returnSize){
int l=0;
int r=numsSize-1;
while(l<r)
{
while(l < numsSize&&nums[l]%2==1)
{
l++;
}
while(r>=0&&nums[r]%2==0)
{
r--;
}
int c=nums[l];
nums[l]=nums[r];
nums[r]=c;
l++;
r--;
}
*returnSize=numsSize;
return nums;
}
思路:双指针,头指针找偶数,奇数则l++,尾指针找奇数,偶数则++
找到后交换,别忘了让l和r都前进一位
最后注意while判断时l和r的条件,避免溢出