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

简介: 力扣(LeetCode)刷题,简单题(第12期)

目录

第1题:移除重复节点


第2题:FizzBuzz


第3题:根据数字二进制下1的数目排序


第4题:最小差值1


第5题:斐波那契数


第6题:数组的相对排序


第7题:解码字母到整数映射


第8题:最长特殊序列1


第9题:单值二叉树


第10题:查找常用字符


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


第1题:移除重复节点

试题要求如下:


image.png


回答(C语言):


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeDuplicateNodes(struct ListNode* head){
  char *map = malloc(20001);
  memset(map, 0, 20001);
  struct ListNode *pre;
  struct ListNode *cur = head;
  while(cur){
    if(map[cur->val] == 0){
      map[cur->val] = 1;
      pre = cur;
    }
    else {
      pre->next = cur->next;  // 删除这个重复的节点
    }
    cur = cur->next;
  }
  free(map);
  return head;
}

运行效率如下所示:


image.png


第2题:FizzBuzz

试题要求如下:


image.png


回答(C语言):


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** fizzBuzz(int n, int* returnSize){
    char** res = (char**)malloc(sizeof(char*)*n);
    char* s;
    for(int i = 0,m = 0;i < n;i++)
    {
        m = i+1;
        if(m%3==0 && m%5!=0)
        {
            s = (char*)malloc(sizeof(char)*5);
            strcpy(s,"Fizz");
            res[i] = s;
        }
        else if(m%3!=0 && m%5==0)
        {
            s = (char*)malloc(sizeof(char)*5);
            strcpy(s,"Buzz");
            res[i] = s;
        }
        else if(m%3==0 && m%5==0)
        {
            s = (char*)malloc(sizeof(char)*9);
            strcpy(s,"FizzBuzz");
            res[i] = s;
        }
        else
        {
            s = (char*)malloc(sizeof(char)*11);
            sprintf(s,"%d",m);
            res[i] = s;
        }
    }
    *returnSize = n;
    return res;
}

运行效率如下所示:


image.png


第3题:根据数字二进制下1的数目排序

试题要求如下:


image.png


回答(C语言):


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int onefigure(int num){
    int fi = 0;
    while(num != 0){
        if((num & 1) == 1){
            fi++;
        }
        num >>= 1;
    }
    return fi;
}
int cmp(const void * a, const void * b){
    int c = *(int *)a,d = *(int*)b;
    int f1 = 0, f2 = 0;
    f1 = onefigure(c);
    f2 = onefigure(d);
    if(f1 == f2){
        return c - d;
    }
    return f1 - f2;
}
int* sortByBits(int* arr, int arrSize, int* returnSize){
    *returnSize = arrSize;
    qsort(arr,arrSize,sizeof(int), cmp);
    return arr;
}

运行效率如下所示:


image.png


第4题:最小差值1

试题要求如下:


image.png


回答(C语言):


int smallestRangeI(int* A, int ASize, int K){
    int min,max,aver;
    min=max=A[0];
    for(int i=0;i<ASize;i++){
        if(max<A[i])max=A[i];
        if(min>A[i])min=A[i];
    }
    aver=(min+max)/2;
    if(abs(max-aver)<=K&&abs(min-aver)<=K)
        return 0;
    return max-min-K-K;
}

运行效率如下所示:


image.png


第5题:斐波那契数

试题要求如下:

image.png



回答(C语言):


int fib(int N){
    int a = 0,b = 1,c = 0;
    if(N == 0){
        return a;
    }
    if(N == 1){
        return b;
    }
    for(int i = 2;i <= N;i++){
        c = a+b;
        a = b;
        b = c;
    }
    return c;
}

运行效率如下所示:


image.png


第6题:数组的相对排序

试题要求如下:


image.png


回答(C语言):


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize){
    int arr[1001]={0};
    int i,j=0;
    //记录arr1数字出现的次数次数
    for(i=0;i<arr1Size;i++){
        arr[arr1[i]]++;
    }
    //找到在arr2和arr1都出现的数字
    for(i=0;i<arr2Size;i++){
        while(arr[arr2[i]]>0){
            arr1[j]=arr2[i];
            j++;
            arr[arr2[i]]--;
        }
    }
    //找arr1有,arr2没有的
    for(i=0;i<1001;i++){
        while(arr[i]>0){
            arr1[j++]=i;
            arr[i]--;
        }
    }
    *returnSize=arr1Size;
    return arr1;
}

运行效率如下所示:

image.png



第7题:解码字母到整数映射

试题要求如下:


image.png


回答(C语言):


char * freqAlphabets(char * s){
    int num = 0,cou = 0;
    char * data_buf = (char *)malloc(sizeof(char) * 1000);
    for(int i = 0;i < strlen(s);){
        if(s[i+1] != '\0' && s[i+2] == '#')
        {
            num = (s[i]-'0') * 10;
            num += s[i+1]-'0';
            data_buf[cou++] = 'a'+(num-1);
            i += 3;
        }
        else
        {
            data_buf[cou++] = 'a'+((s[i]-'0')-1);
            i++;
        }
    }
    data_buf[cou] = '\0';
    return data_buf;
}

运行效率如下所示:


image.png


第8题:最长特殊序列1

试题要求如下:


image.png


回答(C语言):


int findLUSlength(char * a, char * b){
    int alen=strlen(a),blen=strlen(b);
    if (strcmp(a,b)==0)
        return -1;
    return alen>blen?alen:blen;
}

运行效率如下所示:


image.png


第9题:单值二叉树

试题要求如下:


image.png


回答(C语言):


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool RecureTree(struct TreeNode* n, int m){
    if (n == NULL) {
        return true;
    }
    if (n->val != m) {
        return false;
    }
    return RecureTree(n->left, m) & RecureTree(n->right, m);
}
bool isUnivalTree(struct TreeNode* root){
    return RecureTree(root, root->val);
}

运行效率如下所示:


image.png


第10题:查找常用字符

试题要求如下:


image.png


回答(C语言):


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** commonChars(char ** A, int ASize, int* returnSize)
{
    char** ret = (char**)malloc(101 * sizeof(char*));
    int q = 0;
    for (int i = 0; i < 101; i++) {
        ret[i] = (char*)malloc(2 * sizeof(char));
        memset(ret[i], 0, 2);
    }
    int hash[100][128] = {0};  // 用于统计所有单词的字母出现情况
    for (int i = 0; i < ASize; i ++) {
        int j = 0;
        while (A[i][j]) {
            hash[i][A[i][j]]++;
            j++;
        }
    }
    for (int j = 0; j < 128; j++) {
        int min = hash[0][j];
        if (min == 0) {
            continue;
        }
        for (int i = 0; i < ASize; i++) {
            if (hash[i][j] < min) {
                min = hash[i][j];
            }
        }
        while (min) {
            ret[q++][0] = j;
            min--;
        }
    }
    *returnSize = q;
    return ret;
}

运行效率如下所示:

image.png

相关文章
|
5天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
5天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
39 3
|
2月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
17 3
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
18 1
|
2月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
20 1
|
2月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
17 1
|
2月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
19 0
【Leetcode刷题Python】73. 矩阵置零
|
2月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
24 0