力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第1题:在排序数组中查找数字试题要求如下:
回答(C语言):
int search(int* nums, int numsSize, int target){
int cou=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]==target)
{
cou++;
}
}
return cou;
}
运行效率如下所示:
第2题:0~n-1中缺失的数
试题要求如下:
回答(C语言):
int missingNumber(int* nums, int numsSize){
for(int i=0;i<numsSize;i++){
if(nums[i]!=i){
return i;
}
}
return nums[numsSize-1]+1;
}
运行效率如下所示:
第3题:反转单次顺序
试题要求如下:
回答(C语言):
/**
* 去除重复空格,反转整个字符串,再逐个反转单个单词
*
*/
void reverse(char* s, int i, int j){
while(i < j){
char c = s[i];
s[i] = s[j];
s[j] = c;
i++; j--;
}
}
char * reverseWords(char * s){
int i, j, len, flag = 0;
i = j = 0;
while(s[j]){
if(s[j] != ' '){
if(flag == -1 && i > 0){
s[i++] = ' ';
}
s[i++] = s[j++];
flag = 1;
}else{
j++;
flag = -1;
}
}
s[i] = '\0';
reverse(s, 0, i-1);
len = i;
i = 0;
for(j = 0; j <= len; j++){
if(s[j] == ' ' || s[j] == '\0'){
reverse(s, i, j-1);
i = j+1;
}
}
return s;
}
运行效率如下所示:
第4题:和为S的两个数
试题要求如下:
回答(C语言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i=0,j=numsSize-1;
int* data_buf=(int*)malloc(sizeof(int)*2);
memset(data_buf,0,sizeof(data_buf));
*returnSize=2;
while(i<j){
if(nums[i]+nums[j]==target){
data_buf[0]=nums[i];
data_buf[1]=nums[j];
break;
}
if(nums[i]+nums[j]>target)
j--;
else
i++;
}
return data_buf;
}
运行效率如下所示:
第5题:和为S的连续正数序列
试题要求如下:
回答(C语言):
int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
int count = 0;
int MAXN = (int)sqrt(2.0 * target - 0.25); // 确定最大可能的连续值
int SQUARE = MAXN * (MAXN + 1) / 2;
int **res = (int**)malloc(MAXN * sizeof(int*));
int *col = (int*)malloc(MAXN * sizeof(int));
if (target <= SQUARE) SQUARE -= MAXN--; // 连续和大于目标值时减一
while(MAXN > 0) {
if ((target - SQUARE) % (MAXN + 1) == 0) {
int *tmp = (int *)malloc((MAXN + 1) * sizeof(int));
for (int j = 0; j < MAXN + 1; j++) {
*(tmp + j) = (target - SQUARE) / (MAXN + 1) + j;
}
*(res + count) = tmp;
*(col + count) = MAXN + 1;
count++;
}
SQUARE -= MAXN--;
}
*returnSize = count;
*returnColumnSizes = col;
return res;
}
运行效率如下所示:
第6题:左旋转字符串
试题要求如下:
回答(C语言):
char* reverseLeftWords(char* s, int n){
int j=0;
int len=strlen(s);
char *data_buf=(char *)malloc(sizeof(char)*(len+1));
for(int i=n;i<len;i++){
data_buf[j++]=s[i];
}
for(int i=0;i<n;i++){
data_buf[j++]=s[i];
}
data_buf[len]='\0';
return data_buf;
}
运行效率如下所示:
第7题:滑动窗口的最大值
试题要求如下:
回答(C语言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){
if(nums==NULL || numsSize<=0){
*returnSize=0;
return nums;
}
int* data_buf=(int *)malloc(sizeof(int)*(numsSize+1-k));
int num=0;
for(int i=0;i<numsSize+1-k;i++){
num=nums[i];
for(int j=i+1;j<=i+k-1;j++){
if(num<nums[j])
num=nums[j];
}
data_buf[i]=num;
}
*returnSize=numsSize+1-k;
return data_buf;
}
运行效率如下所示:
第8题:扑克牌中的顺子
试题要求如下:
回答(C语言):
int cmp ( const void *a , const void *b )
{
return *(int *)a > *(int *)b;
}
bool isStraight(int* nums, int numsSize){
int zero=0;
qsort(nums,5,sizeof(int),cmp);
for(int i=0;i<numsSize-1;i++)
{
if(nums[i]==0){
zero++;
continue;
}
if(nums[i]==nums[i+1])
return false;
if(nums[i]!=nums[i+1]+1)
zero-=nums[i+1]-nums[i]-1;
}
return zero>=0;
}
运行效率如下所示:
第9题:圆圈中最后剩下的数字
试题要求如下:
回答(C语言):
//约瑟夫环
int lastRemaining(int n, int m){
int res=0;
for(int i=2;i<=n;i++)
res=(res+m)%i;
return res;
}
运行效率如下所示:
第10题:不用加、减、乘、除做加法运算
试题要求如下:
回答(C语言):
int add(int a, int b){
int temp=0;
while(a!=0){
temp=a^b;
a=((unsigned int)(a&b)<<1);
b=temp;
}
return b;
}
运行效率如下所示: