日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

力扣(LeetCode)刷题,简单+中等题(第35期)

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 力扣(LeetCode)刷题,简单+中等题(第35期) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。

第1題:解碼異或后的排列

試題要求如下:

回答(C語言):

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* decode(int* encoded, int encodedSize, int* returnSize) {int n = encodedSize + 1;int total = 0;for (int i = 1; i <= n; i++) {total ^= i;}int odd = 0;for (int i = 1; i < n - 1; i += 2) {odd ^= encoded[i];}int* perm = malloc(sizeof(int) * n);*returnSize = n;perm[0] = total ^ odd;for (int i = 0; i < n - 1; i++) {perm[i + 1] = perm[i] ^ encoded[i];}return perm;
}

運行效率如下所示:


第2題:不同的二叉搜索樹

試題要求如下:

解題思路:

int numTrees(int n) {int G[n + 1];memset(G, 0, sizeof(G));G[0] = G[1] = 1;for (int i = 2; i <= n; ++i) {for (int j = 1; j <= i; ++j) {G[i] += G[j - 1] * G[i - j];}}return G[n];
}

運行效率如下所示:


第3題:完美數

試題要求如下:

解題思路:

本題思路就是簡單的將因子相加,但是注意循環變量i不能到num,所以用i*i<=num縮小范圍。

回答(C語言):

bool checkPerfectNumber(int num){int count=0;if(num==1)return false;for(int i=2;i*i<=num;i++){if(num%i==0)count+=i+num/i;}return count+1==num?true:false;
}

運行效率如下所示:


第4題:數組中兩個數的最大異或值

試題要求如下:

解題思路:

回答(C語言):

const int HIGH_BIT = 30;struct HashTable {int key;UT_hash_handle hh;
};int findMaximumXOR(int* nums, int numsSize) {int x = 0;for (int k = HIGH_BIT; k >= 0; --k) {struct HashTable* hashTable = NULL;// 將所有的 pre^k(a_j) 放入哈希表中for (int i = 0; i < numsSize; i++) {// 如果只想保留從最高位開始到第 k 個二進制位為止的部分// 只需將其右移 k 位int x = nums[i] >> k;struct HashTable* tmp;HASH_FIND_INT(hashTable, &x, tmp);if (tmp == NULL) {tmp = malloc(sizeof(struct HashTable));tmp->key = x;HASH_ADD_INT(hashTable, key, tmp);}}// 目前 x 包含從最高位開始到第 k+1 個二進制位為止的部分// 我們將 x 的第 k 個二進制位置為 1,即為 x = x*2+1int x_next = x * 2 + 1;bool found = false;// 枚舉 ifor (int i = 0; i < numsSize; i++) {int x = x_next ^ (nums[i] >> k);struct HashTable* tmp;HASH_FIND_INT(hashTable, &x, tmp);if (tmp != NULL) {found = true;break;}}if (found) {x = x_next;} else {// 如果沒有找到滿足等式的 a_i 和 a_j,那么 x 的第 k 個二進制位只能為 0// 即為 x = x*2x = x_next - 1;}}return x;
}

運行效率如下所示:


第5題:二叉樹的中序遍歷

試題要求如下:

解題思路:

二叉樹的中序遍歷:按照訪問左子樹——根節點——右子樹的方式遍歷這棵樹,而在訪問左子樹或者右子樹的時候我們按照同樣的方式遍歷,直到遍歷完整棵樹。因此整個遍歷過程天然具有遞歸的性質,我們可以直接用遞歸函數來模擬這一過程。

回答(C語言):

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/
void inorder(struct TreeNode* root, int* res, int* resSize) {if (!root) {return;}inorder(root->left, res, resSize);res[(*resSize)++] = root->val;inorder(root->right, res, resSize);
}int* inorderTraversal(struct TreeNode* root, int* returnSize) {int* res = malloc(sizeof(int) * 501);*returnSize = 0;inorder(root, res, returnSize);return res;
}

運行效率如下所示:


第6題:猜數字大小

試題要求如下:

解題思路:

此題使用二分查找,將mid輸入guess函數,根據返回值調整查找邊界,我這里用的是【left,mid】和【mid+1,right】,命中時將mid返回即可。

回答(C語言):

/** * Forward declaration of guess API.* @param  num   your guess* @return 	     -1 if num is lower than the guess number*			      1 if num is higher than the guess number*               otherwise return 0* int guess(int num);*/int guessNumber(int n){int left=1;int right=n;while(left<right){int mid= left+(right-left)/2;if(guess(mid)<0)right=mid;else if(guess(mid)>0) left=mid+1;else return mid;}return left;
}

運行效率如下所示:


第7題:第三大的數

試題要求如下:

回答(C語言):

int thirdMax(int* nums, int numsSize){int i;int first = INT_MIN, second = INT_MIN, third = INT_MIN;int tmp1 = nums[0], tmp2 = nums[0], tmp3 = nums[0]; for(i = 0; i < numsSize; i++) {/* 先找到第一個與tmp1不同的數,存入tmp2;* 之后找到與tmp1不同的數,都存入tmp3中;* 這里必須將tmp1 == tmp2的判斷放在第二層,若是放在第一層邏輯出現錯誤* if (nums[i] != tmp1 && tmp1 == tmp2) {tmp2 = nums[i];} else {tmp3 = nums[i];}* 當nums[i]等于tmp1時,就不需要判斷了,* 但是上面的代碼還是會執行tmp3 = nums[i],這就導致錯誤。*/if(nums[i] != tmp1) {if(tmp1 == tmp2) {tmp2 = nums[i];} else {tmp3 = nums[i];}}/* 比較當前的數與first、second、third的大小;*          當前數 > first時:third變為second、second變為first、first變為當前數;* first  > 當前數 > second時:third變為second、second變為當前數;* second > 當前數 > third時:third變為當前數;* 其中當前數 == first、second、third時不需要更新三者的值.*/if(nums[i] > first) {third = second;second = first;first = nums[i];} else if(nums[i] < first && nums[i] > second) {third = second;second = nums[i];} else if(nums[i] < second && nums[i] > third) {third = nums[i];}}/* tmp1和tmp2分別與tmp3的值比較是否相等* 若有相等的tmp值,表明數組中只有兩種新的數,返回first* 否則返回third* 這里必須將tmp3與其他兩個相比較,因為tmp3是最后改變的,* 若tmp3也改變了,就說明有三個不同的值。*/if(tmp1 == tmp3 || tmp2 == tmp3) {return first;} else {return third;}
}

運行效率如下所示:


第8題:二叉樹的后序遍歷

試題要求如下:

回答(C語言):

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/
void postorder(struct TreeNode *root, int *res, int *resSize) {if (root == NULL) {return;}postorder(root->left, res, resSize);postorder(root->right, res, resSize);res[(*resSize)++] = root->val;
}int *postorderTraversal(struct TreeNode *root, int *returnSize) {int *res = malloc(sizeof(int) * 2001);*returnSize = 0;postorder(root, res, returnSize);return res;
}

運行效率如下所示:


第9題:N 叉樹的最大深度

試題要求如下:

回答(C語言):

/*** Definition for a Node.* struct Node {*     int val;*     int numChildren;*     struct Node** children;* };*/int maxDepth(struct Node* root)
{if (root == NULL) {return 0; } else {int d = 1, m = 0;for (int i = 0; i < root->numChildren; i++){int c = maxDepth(root->children[i]);if (m < c) { // 找子樹的最大深度 m = c;}}return d + m;}
}

運行效率如下所示:


第10題:字符串中的單詞數

試題要求如下:

解題思路:

判定一個單詞結束:當前字符非空格且下一字符為空格或結束符。

回答(C語言):

int countSegments(char * s){int cnt = 0;while (*s) {if (*s != ' ' && (*(s + 1) == ' ' || *(s + 1) == '\0'))cnt++;s++;}return cnt;
}

運行效率如下所示:?

總結

以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单+中等题(第35期)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。