常见C语言题-解题思路

问题1:逆转字符串

逆转字符串,就是指将一个字符串头尾倒置,变成一个新的字符串

如:abcdefg -> gfedcba

逆转的方法: 只需要遍历一半字符串,并将对应位置上的字符对换即可。字符串中的字符对应一个正整数,因此下面的三种方法都是利用了变换两个整型变量的思想。


利用最简单的交换两个变量的值的方法:

char* Reverse(char* str, int length)
{
    for (int i = 0; i < length / 2; ++i)
    {
        char tmp = str[i];
        str[i] = str[length - 1 - i];
        str[length - 1 - i] = tmp;
    }
    str[length] = 0;
    return str;
}

问题2:大小端判断

void byte_mode()
{
    int value = 0x1;
    if( *(char *)&value = 0x1)
    {
        printf("little end\n");
    }
    else
    {
        printf("big end\n");
    }
}

问题3:两个有序数组,合并成一个有序数组。如果第一个数组空间足够容纳两个数组。

换一种思路,我们採用从后往前合并。首先计算出总长度。设置一个指针从num1数组最后往前移动。

void merge(int* nums1, int m, int* nums2, int n) {
    int newIndex=m+n-1;
    int nums1I=m-1,nums2I=n-1;
    while(nums1I>=0 && nums2I>=0){
        if(nums1[nums1I]>=nums2[nums2I]){
            nums1[newIndex]=nums1[nums1I];
            newIndex--;
            nums1I--;
        }else{
            nums1[newIndex]=nums2[nums2I];
            newIndex--;
            nums2I--;
        }
    }
    while(nums1I>=0){
            nums1[newIndex]=nums1[nums1I];
            newIndex--;
            nums1I--;
    }
    while(nums2I>=0){
            nums1[newIndex]=nums2[nums2I];
            newIndex--;
            nums2I--;
    }
}

问题4:给一个有序数组 arrys, 原地删除重复出现的元素,使每个元素 只出现一次, 不使用额外的数组空间.

int remove(int* arrys, int arrysSize){
    if (arrysSize < 2) 
    {
       return arrysSize;
    }
    int j = 0;
    for (int i = 1; i < arrysSize; i++)
    {
        if (arrys[j] != arrys[i])
        {
          arrys[++j] = arrys[i];  
        } 
    }
    return ++j;
}

问题5:链表逆序

STU *link_reversed_order(STU *head)
{
    STU *pf = NULL, *pb = NULL, *tmp = NULL; 
    pf = head;  //将头节点的地址赋值给pf 
    if(head == NULL) {  
        printf("链表为空,不需要逆序!\n");
        return head;
    } else if(head->next == NULL) { 
        printf("链表只有一个节点,不需要逆序!\n");
        return head;
    } else {
        pb = pf->next;  //pb指向pf的下一个节点 
        head->next = NULL; //头节点的指针域置空(变为尾节点) 
        while(pb != NULL)
        {
            tmp = pb;    //将pb的地址赋值给temp 
            pb = pb->next; //pb指向下一个节点 
            tmp->next = pf;    //pb的上一个节点的指针域指向pf 
            pf = tmp;    //让pf指向tmp 
        }
        head = pf;
        return head;
    }    
}
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值