力扣(LeetCode)刷题,简单题(第18期)
目錄
第1題:好數(shù)對(duì)的數(shù)目
第2題:返回倒數(shù)第k個(gè)節(jié)點(diǎn)
第3題:將每個(gè)元素替換為右側(cè)最大元素
第4題:刪除最外層的括號(hào)
第5題:6和9組成的最大數(shù)
第6題:搜索插入位置
第7題:判定字符是否唯一
第8題:唯一摩爾斯密碼詞
第9題:統(tǒng)計(jì)有序矩陣中的負(fù)數(shù)
第10題:二叉搜索樹的第k大節(jié)點(diǎn)
力扣(LeetCode)定期刷題,每期10道題,業(yè)務(wù)繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:好數(shù)對(duì)的數(shù)目
試題要求如下:
回答(C語(yǔ)言):
int numIdenticalPairs(int* nums, int numsSize){int hash[101];int res = 0;memset(hash, 0, 101 * sizeof(int));for(int i = 0; i < numsSize; ++i) {hash[nums[i]] += 1;}for(int i = 0; i < 101; ++i) {if(hash[i] >= 2) {res += hash[i] * (hash[i]-1) / 2;}}return res;
}
運(yùn)行效率如下所示:
第2題:返回倒數(shù)第k個(gè)節(jié)點(diǎn)
試題要求如下:
解答思路:
1、先讓t向前走K步;
2、head和t同步前進(jìn),t到結(jié)尾,head到目標(biāo)。
回答(C語(yǔ)言):
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k){struct ListNode*t = head;while (k--){t = t->next;}while (t){t = t->next;head = head->next;}return head->val;
}
運(yùn)行效率如下所示:
第3題:將每個(gè)元素替換為右側(cè)最大元素
試題要求如下:
回答(C語(yǔ)言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* replaceElements(int* arr, int arrSize, int* returnSize){int temp_max = 0,temp_num = 0;temp_max = arr[arrSize-1];for(int i = arrSize-2; i >= 0; i--){temp_num = arr[i];arr[i] = temp_max;if(temp_max < temp_num){temp_max = temp_num;}}arr[arrSize-1] = -1;*returnSize = arrSize;return arr;
}
運(yùn)行效率如下所示:
第4題:刪除最外層的括號(hào)
試題要求如下:
回答(C語(yǔ)言):
char * removeOuterParentheses(char * S){int cnt = 0,k = 0;for(int i = 0;i < strlen(S);i++){if(S[i] == '('){if(cnt != 0) S[k++] = S[i];cnt ++;}if(S[i] == ')'){cnt--;if(cnt != 0) S[k++] = S[i];}}S[k] = '\0';return S;
}
運(yùn)行效率如下所示:
第5題:6和9組成的最大數(shù)
試題要求如下:
解答思路:
現(xiàn)在把?9?翻轉(zhuǎn)成?6?是不合理的,因?yàn)樗鼤?huì)使得數(shù)字變小。因此我們應(yīng)當(dāng)找到?num?中最高位的?6,將其翻轉(zhuǎn)成?9。
回答(C語(yǔ)言):
#include <Math.h>int maximum69Number (int num){int count = 0, th = 0; // count 記錄除了多少次,th記錄最大的6在第幾位int re = num;while(re){count++;if(re%10==6)th = count;re /= 10;}return num+3*pow(10,th-1);
}
運(yùn)行效率如下所示:
第6題:搜索插入位置
試題要求如下:
回答(C語(yǔ)言):
int searchInsert(int* nums, int numsSize, int target){int low = 0;int high = numsSize - 1;int mid = 0;while (low <= high){mid = low + (high - low) / 2;if (target > nums[mid]){low = mid + 1;}else if (target < nums[mid]){high = mid - 1;}else if (target == nums[mid]){return mid;}}return low;
}
運(yùn)行效率如下所示:
第7題:判定字符是否唯一
試題要求如下:
回答(C語(yǔ)言):
bool isUnique(char* astr){int len = strlen(astr);char* temp_data = (char*)malloc(sizeof(char)*(26));memset(temp_data,0,26);for(int i = 0,cou = 0; i < len; i++){cou = astr[i]-'a';if(temp_data[cou] == 0){temp_data[cou] = astr[i];}else{return false;}}return true;
}
運(yùn)行效率如下所示:
第8題:唯一摩爾斯密碼詞
試題要求如下:
解答思路:
建立字符串?dāng)?shù)組morse,存放words中的字符串轉(zhuǎn)成莫爾斯密碼后的字符串,每次處理words中的字符串,如果不重復(fù),就添加到morse里面,最終輸出morse中字符串的個(gè)數(shù)。
回答(C語(yǔ)言):
int uniqueMorseRepresentations(char ** words, int wordsSize){char dict[26][5] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};//5*12 = 60char morse[100][60] = {0};int count = 0;for (int i = 0; i < wordsSize; i++) {char tmp[60] = { 0 };int flag = 0;//每個(gè)字符串對(duì)應(yīng)的摩斯碼放入tmp中for (int j = 0; j < strlen(words[i]); j++) {strcat(tmp, dict[words[i][j] - 'a']);}//定義flag分辨相同和不同,如果tmp和morse中的不同 就放入morse中for (int k = 0; k < count; k++) {if (strcmp(morse[k], tmp) == 0) {flag = 1;break;}}//不同的話就放入morse中if (flag == 0) {strcpy(morse[count], tmp);count++;}}return count;
}
運(yùn)行效率如下所示:
第9題:統(tǒng)計(jì)有序矩陣中的負(fù)數(shù)
試題要求如下:
解答思路:
從最后一行最后一列掃描,若此行最后一個(gè)元素 >0 則直接返回,若此列某個(gè)元素 >0 則跳出內(nèi)循環(huán),檢查上一行。
回答(C語(yǔ)言):
int countNegatives( int ** grid , int gridSize , int * gridColSize)
{int count = 0;for( int i = gridSize - 1 ; i >= 0 ; i-- ){int j = *( gridColSize + i ) - 1;if( *( *( grid + i ) + j ) >= 0 ){return count;}for( ; j >= 0 ;j-- ){if( *( *( grid + i ) + j ) >= 0 ){break;}count++;}}return count;
}
運(yùn)行效率如下所示:
第10題:二叉搜索樹的第k大節(jié)點(diǎn)
試題要求如下:
解答思路:
本文解法基于此性質(zhì):二叉搜索樹的中序遍歷為?遞增序列?。
根據(jù)以上性質(zhì),易得二叉搜索樹的 中序遍歷倒序 為 遞減序列 。因此,求 “二叉搜索樹第 kk 大的節(jié)點(diǎn)” 可轉(zhuǎn)化為求 “此樹的中序遍歷倒序的第 kk 個(gè)節(jié)點(diǎn)”。
回答(C語(yǔ)言):
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void inOrderReverse(struct TreeNode *root, int k, int *cnt, int *ret) {if (NULL == root || *cnt >= k)return;inOrderReverse(root->right, k, cnt, ret);(*cnt)++;if (*cnt == k)*ret = root->val;inOrderReverse(root->left, k, cnt, ret);
}int kthLargest(struct TreeNode *root, int k) {int ret;int cnt;inOrderReverse(root, k, &cnt, &ret);return ret;
}
運(yùn)行效率如下所示:
總結(jié)
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第18期)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 力扣(LeetCode)刷题,简单题+中
- 下一篇: C语言:十六进制(HEX)和浮点类型(f