leetcode 编程的坑

1、不能使用数学库max

解决方法:自定义

#define max(x, y)  ((x > y) ? x:y)

2、全局变量int visited[MAX][MAX] = {{0}};默认不会初始化, 需要显示初始化

     不能直接使用超大的局部变量数组,需要动态申请

解决方法

1、二维显示初始化

    for (i=0; i<m; i++)

      for (j=0; j<n; j++)

        visited[i][j] = 0;

2、使用动态数组

/* Alloc all elements of array[x][y]
    0 -- -- > x/m
    |
    v 
    y/n                          **/
int** AllocMap(int x, int y) {
    int m;
    int **map = (int **)calloc(sizeof(int *), x);

    for (m=0; m<x; m++)
      map[m] = (int *)calloc(sizeof(int), y);

    return map;
}

3、技巧:获取链表的中间结点(快慢指针法)

struct TreeNode *addNote(int val) {

    struct TreeNode *newNote = (struct TreeNode *)calloc(sizeof(struct TreeNode), 1);

    newNote->val = val;

    newNote->left = NULL;

    newNote->right = NULL;

    return newNote;

}

struct ListNode *getMedim(struct ListNode *head, struct ListNode *end) {

    struct ListNode *step1 = head;

    struct ListNode *step2 = head;

    while (step2 != end && step2->next != end) {

        step1 = step1->next;

        step2 = step2->next->next;

    }

    return step1;

}

4、LeetCode采用多线程,因此在处理第二个样例时并不会将全局变量清零;前面的计算结果会遗留,导致结果随机性==》解决方法:全局变量显示全部清零

5、使用二维指针,看作是一个可变长度的指针数组,可以用于记录指针结点。此时可以作为一个一维数组访问。

int** pathSum(struct TreeNode* root, int target, int* returnSize, int** returnColumnSizes){

   int size = 10;

   struct TreeNode**mem = (struct TreeNode**) calloc (size, sizeof (struct TreeNode*));

   printf ("%p %p\n", mem[0], mem[1]);
   printf ("%p %p\n", &mem[0], &mem[1]);

   mem[0] = root;
   mem[1] = root->left;

   printf ("%p %p\n", mem[0], mem[1]);
   printf ("%p %p\n", &mem[0], &mem[1]);

   return mem;
}

6、leetCode中qsort输入参数可能不支持二维数组(原因: AddressSanitizer相关),可以转换为结构体数组。比如

    element array[salesSize];

    for (int i = 0; i < salesSize; i++) {

        array[i].a = sales[i][0]; array[i].b = sales[i][1];array[i].c = sales[i][2];

        array[i].num = i;

    }

// 升序排列,qsort只有大于1的才交换

int comp(const void* a, const void* b) {

    element saleA = *(element*)a;

    element saleB = *(element*)b;

    int key[3];

    key[0] = saleA.b - saleB.b; // 成本

    key[1] = saleA.c - saleB.c;  // 利润

    key[2] = saleA.num - saleB.num; // 序号

    for (int i=0; i<3; i++) {

        if (key[i] != 0) {

            return key[i];

        }

        i++;

    }

}

7、Leetcode中的HASH使用,第二个参数必须要和结构体中定义的成员变量名一致,也就是这个局部变量的名称不能是随意的

typedef struct HashNode {
    int key1;
    int pos;
    UT_hash_handle hh;
} Node;

   Node* g_users = NULL;  // 全局变量需要'函数内'新初始化

  for (int i=0; i<nums2Size; i++) {
      Node* s1 = (Node*)malloc(sizeof(Node));
      int key = nums2[i];
      s1->key1 = key;
      s1->pos = i;

      HASH_ADD_INT(g_users, key, s1);
  }

8、Leetcode240:  , 注意qsort和bsearch定义的比较函数是有区别的,qsort只关注>0的做交换,而不需要关注等于。而bsearch可能查找失败,因此还关心等于,因此后续定义comp建议用相减,而不用比较操作。

9、给定的HASH接口中HASH_FIND_STR((Node *)pTable, &value, node)获取的node->count记录指定单元素的个数,而HASH_COUNT((Node *)pTable) 记录整个Hash的总元素个数 (重复的元素插入数量也是增加,因此大部分代码中避免重复插入一般使用HASH_FIND_STR确认是否已经存在?

#include <uthash.h>
typedef struct HashNode {
    char value[12];
    int count;
    UT_hash_handle hh;
} Node;

参考https://oj.rnd.huawei.com/problems/1790/submissions

         C语言uthash介绍 - achievelv - 博客园

注意:字符串的hash 查找接口HASH_FIND_STR

     a) 如果使用HASH_FIND_INT编译不提示错误,但是返回接口可能莫名其妙 

     b) 对STR类型的的HashNode结构体中定义的字符串,需要确保字符串以'\0'结尾

10、HASH_DEL 、HASH_SORT 和 HASH_ADD_INT 接口会变更hash内的数据,因此不能经过指针中转,比如

int sort (Leaderboard* obj) {
    Node *pTable = obj->pTable;
    HASH_SORT (obj->pTable, cmp);  // 排序成功
    HASH_SORT (pTable, cmp);       // 排序不成功, cmp 同快速排序
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值