1
力扣 (LeetCode) 刷题,简单题 (第 12 期)
发布于: 2021 年 03 月 30 日
力扣(LeetCode)定期刷题,每期 10 道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第 1 题:移除重复节点
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 2 题:FizzBuzz
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 3 题:根据数字二进制下 1 的数目排序
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 4 题:最小差值 1
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 5 题:斐波那契数
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 6 题:数组的相对排序
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 7 题:解码字母到整数映射
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 8 题:最长特殊序列 1
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
第 9 题:单值二叉树
试题要求如下:
回答(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);
}
复制代码
运行效率如下所示:
第 10 题:查找常用字符
试题要求如下:
回答(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;
}
复制代码
运行效率如下所示:
划线
评论
复制
发布于: 2021 年 03 月 30 日阅读数: 8
版权声明: 本文为 InfoQ 作者【不脱发的程序猿】的原创文章。
原文链接:【http://xie.infoq.cn/article/33d21fc2084489e07840e9383】。文章转载请联系作者。
不脱发的程序猿
关注
【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入
【公众号】美男子玩编程
评论