66. 加一
/** * Note: The returned array must be malloced, assume caller calls free(). */ /* 从后向前(从个位)开始+1,逢九进一,不为九时结束,全为九时数组长度加一 解法如下: 特别要注意的是returnSize,这个代表返回指针的长度,要不上层代码不知道要取多少个 */ int* plusOne(int* digits, int digitsSize, int* returnSize) { for (int i = digitsSize - 1; i >= 0; i--) { if (digits[i] == 9) { digits[i] = 0; } else { digits[i]++; *returnSize = digitsSize; return digits; } } int *res = malloc(sizeof(int) * (digitsSize + 1)); memset(res, 0, sizeof(int) * (digitsSize + 1)); *returnSize = digitsSize + 1; res[0] = 1; return res; }
735. 行星碰撞
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* asteroidCollision(int* asteroids, int asteroidsSize, int* returnSize) { *returnSize = 0; if (asteroids == NULL) { return NULL; } int *res = malloc(sizeof(int) * asteroidsSize); int idx = 0; for (int i = 0; i < asteroidsSize; i++) { res[idx++] = asteroids[i]; // 碰撞条件:左正右负 while (idx >= 2 && res[idx - 2] > 0 && res[idx - 1] < 0) { int left = res[idx - 2]; int right = res[idx - 1]; if (abs(left) == abs(right)) { idx -= 2; } else if (abs(left) < abs(right)) { res[idx - 2] = right; idx--; } else { idx--; } } } *returnSize = idx; return res; }
3. 无重复字符的最长子串
typedef struct { int c; // 要用int int value; UT_hash_handle hh; } hashTable; hashTable *g_hash = NULL; hashTable* FindNode(int ic) { hashTable* tmp = NULL; HASH_FIND_INT(g_hash, &ic, tmp); return tmp; } void AddNode(int ic) { hashTable *it = FindNode(ic); if (it == NULL) { it = malloc(sizeof(hashTable)); it->c = ic; HASH_ADD_INT(g_hash, c, it); } it->value = 1; } void DelNode(int ic) { hashTable *it = FindNode(ic); if (it != NULL) { HASH_DEL(g_hash, it); it->value = 0; free(it); } } void ClearAllNode() { hashTable *curr, *tmp; HASH_ITER(hh, g_hash, curr, tmp) { HASH_DEL(g_hash, curr); free(curr); } } int lengthOfLongestSubstring(char * s) { if (s == NULL) { return 0; } if (s[0] == '\0') { return 0; } int start = 0; int end = 0; int max = 0; int subLen = 0; while (s[end] != '\0') { if (FindNode((int)s[end]) == NULL) { AddNode((int)s[end]); subLen = end - start + 1; max = subLen > max ? subLen : max; end++; } else { DelNode((int)s[start]); start++; } } ClearAllNode(); return max; }