力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第1题:只出现一次的数字试题要求如下:
回答(C语言):
//按位异或,相同的数异或为0,任何数与0异或为原数不变
int singleNumber(int* nums, int numsSize){
int a = 0;
for(int i = 0;i < numsSize ;i++){
a ^= nums[i];
}
return a;
}
第2题:两数之和
试题要求如下:
回答(C语言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numbersSize, int target, int* returnSize){
int *res = malloc(sizeof(int) * 2);
*returnSize = 2;
int i = 0;
int j = numbersSize - 1;
while(true){
if (nums[i] + nums[j] > target) {
j--;
} else if (nums[i] + nums[j] < target) {
i++;
} else{
res[0] = i+1;
res[1] = j+1;
break;
}
}
return res;
}
第3题:Excel表列名称
试题要求如下:
回答(C语言):
char * convertToTitle(int n){
int len = 0, tmp = n;
while (tmp){
len++;
tmp = (tmp - 1) / 26;
}
char *res = (char*)malloc(len + 1);
tmp = n;
res[len] = 0;
while (len--){
res[len] = (tmp - 1) % 26 + 'A';
tmp = (tmp - 1) / 26;
}
return res;
}
第4题:数组中重复的数字
试题要求如下:
回答(C语言):
int comp(const void *a, const void *b) {
return *(int *)a < *(int *)b; //从小到大排序
}
int findRepeatNumber(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(int), comp);
for (int i = 0; i < numsSize-1; i++) {
if (nums[i] == nums[i+1])
return nums[i];
}
return -1;
}
第5题:二维数组中的查找
试题要求如下:
回答(C语言):
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
if(matrix==NULL || matrixSize==0 || matrixColSize[0]==NULL)
return false;
for(int i=0;i<matrixSize;i++){
for(int j=0;j<matrixColSize[0];j++){
if(matrix[i][j]==target)
return true;
}
}
return false;
}
第6题:替换空格
试题要求如下:
回答(C语言):
char* replaceSpace(char* s){
int i=0,cou=0,len_s=strlen(s);
while(i<len_s){
if(s[i]==' '){
cou++;
}
i++;
}
char* buf_str=(char*)malloc(sizeof(char)*(len_s+(cou*2)+1));
int j=0;
i=0;
while(i<len_s){
if(s[i]==' '){
buf_str[j++]='%';
buf_str[j++]='2';
buf_str[j]='0';
}
else{
buf_str[j]=s[i];
}
i++;
j++;
}
buf_str[j]='\0';
return buf_str;
}
第7题:从头到尾打印链表
试题要求如下:
回答(C语言):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* reversePrint(struct ListNode* head, int* returnSize){
struct ListNode *p=head,*q=head;
returnSize[0]=0;
while(p!=NULL){
returnSize[0]++;
p=p->next;
}
int *buf_data=(int *)malloc(sizeof(int)*(returnSize[0]));
int len=returnSize[0];
while(q!=NULL){
buf_data[--len]=q->val;
q=q->next;
}
return buf_data;
}
第8题:斐波拉契数列
试题要求如下:
回答(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;
if (c > 1000000007)
c %= 1000000007;
a=b;
b=c;
}
return c;
}
第9题:青蛙跳台阶问题
试题要求如下:
回答(C语言):
int numWays(int n){
int a=1,b=1,c=0;
if(n==0){
return a;
}
if(n==1){
return b;
}
for(int i=2;i<=n;i++){
c=a+b;
if (c > 1000000007)
c %= 1000000007;
a=b;
b=c;
}
return c;
}
第10题:旋转数组的最小数
试题要求如下:
回答(C语言):
int minArray(int* numbers, int numbersSize){
int cou=numbersSize-1;
while(cou-1>=0){
if(numbers[cou-1]>numbers[cou]){
break;
}
cou--;
}
return numbers[cou];
}