c语言每日三题-----提高你的编程能力

图片整理(字符排序)

Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
数据范围:每组输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
输入描述:
Lily使用的图片包括"A"到"Z"、“a"到"z”、“0"到"9”。输入字母或数字个数不超过1024。
输出描述:
Lily的所有图片按照从小到大的顺序输出

题目链接-----https://www.nowcoder.com/practice/2de4127fda5e46858aa85d254af43941?tpId=37&&tqId=21257&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

解题思路:直接用qsort函数进行快速排序就行,如果对qsort不太理解的可以看一下我之前的博客

#include<stdio.h>
int cmp_char(const void* e1,const void* e2)
{ 
   return  *(char*)e1-*(char*)e2;
}
int main()
{
    char arr[1001]={0};
    scanf("%s",arr);
    qsort(arr,strlen(arr),1,cmp_char);
    printf("%s\n",arr);
    return 0;
}

寻找中心下标

给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-pivot-index

解题思路:
1 先求出整个数组的和sum1。
2 然后从下标0的位置累计求和值下标为i得到sum2,然后sum2减去下标i,与sum1减去下标0到i的数

int pivotIndex(int* nums, int numsSize)
{
    int i=0;
    int sum1=0,sum2=0;
    for(i=0;i<numsSize;i++)
    sum1=sum1+nums[i];
    for(i=0;i<numsSize;i++)
    {
      sum1=sum1-nums[i];
      sum2=sum2+nums[i];
      if(sum1==(sum2-nums[i]))
      {
          return i;
      }
    }
    return -1;
}

求两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。
题目链接:
https://leetcode-cn.com/problems/intersection-of-two-arrays/

解题思路:
1 先使用qsort快速排序两个数组,
2 然后分别从两个数组下标为0的位置进行比较
3 如果相等,则填入目标数组,然后注意,可能会出现多个重复的,所以填入的数字所位于的下标要与前面的
数字进行比较判断,因为两个数组都已经排序好了,所以只需要比较前一个数字
4 如果不等呢? 小的数字,下标+1

来看代码

int cmp_int(const void* e1,const void* e2)
 {
     return *(int*)e1-*(int*)e2;
 }
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
         qsort(nums1,nums1Size,4,cmp_int);
         qsort(nums2,nums2Size,4,cmp_int);
         int i=0,j=0,k=0;
         static arr[1000];
         while(i<nums1Size && j<nums2Size)
         {
             if(nums1[i]==nums2[j])
             {
                 //如果目标数组没有元素直接填,与前面一个相比不等也填入
                 //nums[i]为即将填入的数字,如果写成arr[k]!=arr[k-1]会出现错误
                 if((k==0)||(nums1[i]!=arr[k-1]))
                 {
                     arr[k]=nums1[i];
                     k++;
                 }
                 i++;     //只要两个数组元素相等就都加1,如果放在里面的if里面会出错
                 j++;
             }
             else if(nums1[i]>nums2[j])
                    j++;
             else
                    i++;
         }
         *returnSize=k;
         return arr;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值