力扣(LeetCode)刷题,简单题(第18期)

举报
不脱发的程序猿 发表于 2020/12/27 23:48:08 2020/12/27
【摘要】 目录 第1题:好数对的数目 第2题:返回倒数第k个节点 第3题:将每个元素替换为右侧最大元素 第4题:删除最外层的括号 第5题:6和9组成的最大数 第6题:搜索插入位置 第7题:判定字符是否唯一 第8题:唯一摩尔斯密码词 第9题:统计有序矩阵中的负数 第10题:二叉搜索树的第k大节点 力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看...

目录

第1题:好数对的数目

第2题:返回倒数第k个节点

第3题:将每个元素替换为右侧最大元素

第4题:删除最外层的括号

第5题:6和9组成的最大数

第6题:搜索插入位置

第7题:判定字符是否唯一

第8题:唯一摩尔斯密码词

第9题:统计有序矩阵中的负数

第10题:二叉搜索树的第k大节点


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

第1题:好数对的数目

试题要求如下:

回答(C语言):


  
  1. int numIdenticalPairs(int* nums, int numsSize){
  2. int hash[101];
  3. int res = 0;
  4. memset(hash, 0, 101 * sizeof(int));
  5. for(int i = 0; i < numsSize; ++i) {
  6. hash[nums[i]] += 1;
  7. }
  8. for(int i = 0; i < 101; ++i) {
  9. if(hash[i] >= 2) {
  10. res += hash[i] * (hash[i]-1) / 2;
  11. }
  12. }
  13. return res;
  14. }

运行效率如下所示:


第2题:返回倒数第k个节点

试题要求如下:

解答思路:

1、先让t向前走K步;

2、head和t同步前进,t到结尾,head到目标。

回答(C语言):


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. int kthToLast(struct ListNode* head, int k){
  9. struct ListNode*t = head;
  10. while (k--){
  11. t = t->next;
  12. }
  13. while (t){
  14. t = t->next;
  15. head = head->next;
  16. }
  17. return head->val;
  18. }

运行效率如下所示:


第3题:将每个元素替换为右侧最大元素

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int* replaceElements(int* arr, int arrSize, int* returnSize){
  5. int temp_max = 0,temp_num = 0;
  6. temp_max = arr[arrSize-1];
  7. for(int i = arrSize-2; i >= 0; i--){
  8. temp_num = arr[i];
  9. arr[i] = temp_max;
  10. if(temp_max < temp_num){
  11. temp_max = temp_num;
  12. }
  13. }
  14. arr[arrSize-1] = -1;
  15. *returnSize = arrSize;
  16. return arr;
  17. }

运行效率如下所示:


第4题:删除最外层的括号

试题要求如下:

回答(C语言):


  
  1. char * removeOuterParentheses(char * S){
  2. int cnt = 0,k = 0;
  3. for(int i = 0;i < strlen(S);i++){
  4. if(S[i] == '('){
  5. if(cnt != 0) S[k++] = S[i];
  6. cnt ++;
  7. }
  8. if(S[i] == ')'){
  9. cnt--;
  10. if(cnt != 0) S[k++] = S[i];
  11. }
  12. }
  13. S[k] = '\0';
  14. return S;
  15. }

运行效率如下所示:


第5题:6和9组成的最大数

试题要求如下:

解答思路:

现在把 9 翻转成 6 是不合理的,因为它会使得数字变小。因此我们应当找到 num 中最高位的 6,将其翻转成 9

回答(C语言):


  
  1. #include <Math.h>
  2. int maximum69Number (int num){
  3. int count = 0, th = 0; // count 记录除了多少次,th记录最大的6在第几位
  4. int re = num;
  5. while(re){
  6. count++;
  7. if(re%10==6)
  8. th = count;
  9. re /= 10;
  10. }
  11. return num+3*pow(10,th-1);
  12. }

运行效率如下所示:


第6题:搜索插入位置

试题要求如下:

回答(C语言):


  
  1. int searchInsert(int* nums, int numsSize, int target){
  2. int low = 0;
  3. int high = numsSize - 1;
  4. int mid = 0;
  5. while (low <= high){
  6. mid = low + (high - low) / 2;
  7. if (target > nums[mid]){
  8. low = mid + 1;
  9. }
  10. else if (target < nums[mid]){
  11. high = mid - 1;
  12. }
  13. else if (target == nums[mid]){
  14. return mid;
  15. }
  16. }
  17. return low;
  18. }

运行效率如下所示:


第7题:判定字符是否唯一

试题要求如下:

回答(C语言):


  
  1. bool isUnique(char* astr){
  2. int len = strlen(astr);
  3. char* temp_data = (char*)malloc(sizeof(char)*(26));
  4. memset(temp_data,0,26);
  5. for(int i = 0,cou = 0; i < len; i++){
  6. cou = astr[i]-'a';
  7. if(temp_data[cou] == 0){
  8. temp_data[cou] = astr[i];
  9. }
  10. else{
  11. return false;
  12. }
  13. }
  14. return true;
  15. }

运行效率如下所示:


第8题:唯一摩尔斯密码词

试题要求如下:

解答思路:

建立字符串数组morse,存放words中的字符串转成莫尔斯密码后的字符串,每次处理words中的字符串,如果不重复,就添加到morse里面,最终输出morse中字符串的个数。

回答(C语言):


  
  1. int uniqueMorseRepresentations(char ** words, int wordsSize){
  2. char dict[26][5] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
  3. //5*12 = 60
  4. char morse[100][60] = {0};
  5. int count = 0;
  6. for (int i = 0; i < wordsSize; i++) {
  7. char tmp[60] = { 0 };
  8. int flag = 0;
  9. //每个字符串对应的摩斯码放入tmp中
  10. for (int j = 0; j < strlen(words[i]); j++) {
  11. strcat(tmp, dict[words[i][j] - 'a']);
  12. }
  13. //定义flag分辨相同和不同,如果tmp和morse中的不同 就放入morse中
  14. for (int k = 0; k < count; k++) {
  15. if (strcmp(morse[k], tmp) == 0) {
  16. flag = 1;
  17. break;
  18. }
  19. }
  20. //不同的话就放入morse中
  21. if (flag == 0) {
  22. strcpy(morse[count], tmp);
  23. count++;
  24. }
  25. }
  26. return count;
  27. }

运行效率如下所示:


第9题:统计有序矩阵中的负数

试题要求如下:

解答思路:

从最后一行最后一列扫描,若此行最后一个元素 >0 则直接返回,若此列某个元素 >0 则跳出内循环,检查上一行。

回答(C语言):


  
  1. int countNegatives( int ** grid , int gridSize , int * gridColSize)
  2. {
  3. int count = 0;
  4. for( int i = gridSize - 1 ; i >= 0 ; i-- )
  5. {
  6. int j = *( gridColSize + i ) - 1;
  7. if( *( *( grid + i ) + j ) >= 0 )
  8. {
  9. return count;
  10. }
  11. for( ; j >= 0 ;j-- )
  12. {
  13. if( *( *( grid + i ) + j ) >= 0 )
  14. {
  15. break;
  16. }
  17. count++;
  18. }
  19. }
  20. return count;
  21. }

运行效率如下所示:


第10题:二叉搜索树的第k大节点

试题要求如下:

解答思路:

本文解法基于此性质:二叉搜索树的中序遍历为 递增序列 。

根据以上性质,易得二叉搜索树的 中序遍历倒序 为 递减序列 。因此,求 “二叉搜索树第 kk 大的节点” 可转化为求 “此树的中序遍历倒序的第 kk 个节点”。

回答(C语言):


  
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. void inOrderReverse(struct TreeNode *root, int k, int *cnt, int *ret) {
  10. if (NULL == root || *cnt >= k)
  11. return;
  12. inOrderReverse(root->right, k, cnt, ret);
  13. (*cnt)++;
  14. if (*cnt == k)
  15. *ret = root->val;
  16. inOrderReverse(root->left, k, cnt, ret);
  17. }
  18. int kthLargest(struct TreeNode *root, int k) {
  19. int ret;
  20. int cnt;
  21. inOrderReverse(root, k, &cnt, &ret);
  22. return ret;
  23. }

运行效率如下所示:

文章来源: blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_38106923/article/details/107309976

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。