文章目录
x的平方根
int mySqrt(int x)
{
int low = 0, mid = 0, high = x;
if (x < 0)
return -1;
if (x <= 1)
return x;
while(low + 1 < high)
{
mid = low + (high - low) / 2;
if (x / mid < mid)
high = mid;
else
low = mid;
}
return low;
}
宝石与石头
int numJewelsInStones(char * J, char * S)
{
int num = 0;
for(int i = 0; S[i] != '\0'; i++)
{
if(strchr(J,S[i]))
num++;
}
return num;
}
猜数字大小
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
int guessNumber(int n)
{
if(guess(n) == 0)
return n;
int low = 1, high = n, mid;
while(low < high)
{
mid = (low + high) / 2;
int rest = guess(mid);
if(rest == 0)
return mid;
else
if (rest == 1)
low = mid + 1;
else
high = mid;
}
return low;
}
猜数字几个正确
int game(int* guess, int guessSize, int* answer, int answerSize)
{
int count = 0;
for(int a = 0; a < guessSize; a++)
{
if(guess[a] == answer[a])
count++;
}
return count;
}
查找二维数组中的数
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target)
{
if (matrix == NULL || matrixSize == 0 || matrixColSize == NULL || *matrixColSize == 0)
return false;
int i = 0, j = *matrixColSize - 1;
while (i < matrixSize && j >= 0)
if (matrix[i][j] == target)
return true;
else if (matrix[i][j] > target)
j--;
else
i++;
return false;
}
打家劫舍
int rob(int* nums, int numsSize)
{
int Ak, Ak_1, Ak_2;
int i;
if(numsSize == 0)return 0;
if(numsSize == 1)return nums[0];
if(numsSize == 2)return nums[0] > nums[1] ? nums[0] : nums[1];
Ak_2 = nums[0];
Ak_1 = nums[0] > nums[1] ? nums[0] : nums[1];
for(i = 2; i < numsSize; i++){
Ak = (Ak_2 + nums[i]) > Ak_1 ? Ak_2 + nums[i] : Ak_1;
Ak_2 = Ak_1;
Ak_1 = Ak;
}
return Ak;
}
打家劫舍2
int rob(int* nums, int numsSize)
{
int a, b, temp;
if(numsSize == 0)
return 0;
if(numsSize == 1)
return nums[0];
if(numsSize == 2)
return nums[0] > nums[1] ? nums[0] : nums[1];
b = nums[0];
a = nums[0] > nums[1] ? nums[0] : nums[1];
for(int i = 2; i < numsSize; i++ )
{
temp = a;
a = b + nums[i] > a ? b + nums[i] : a;
b = temp;
}
return a;
}
//每次循环开始之前,a存储前i-1个房间可以偷最大值,
// b存储前i个房间可以偷最大值
递归求X的Y次幂
double Pow(double x,int y)
{
if(y==0)
return 1;
else
return(x*Pow(x,y-1));
}
非递减数列
bool checkPossibility(int* nums, int numsSize)
{
if (numsSize < 3)
{
return true;
}
int count = 0;
if (nums[0] > nums[1])
{
nums[0] = nums[1];
count++;
}
for (int i = 1; i < numsSize - 1; i++)
{
int right = nums[i+1];
if (nums[i] > right)
{
count++;
if (count > 1)
return false;
int left = nums[i-1];
if (left > right)
nums[i+1] = nums[i];
else
nums[i] = left;
}
}
return true;
}
斐波那契数列
int fib(int n)
{
if(n == 0)
return 0;
if(n == 1)
return 1;
int a = 0, b = 1, sum = 0;
for( int i = 1; i < n; i++ )
{
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return sum;
}
和
int *result = (int *)malloc(sizeof(int) * 2);
for (int i = 0; i < numsSize - 1; i++)
{
for (int j = i + 1; j < numsSize; j++)
{
if (nums[i] + nums[j] == target)
{
result[0] = i;
result[1] = j;
*returnSize = 2;
return result;
}
}
}
return result;
回文数
bool isPalindrome(int x)
{
long s = 0;
int x1 = x;
while (x1 > 0)
{
s = s * 10 + x1 % 10;
x1 = x1 / 10;
}
return s == x;
}
将数字变成0的操作步数
int numberOfSteps (int num)
{
int n=0;
while(num!=0)
{
if(num%2==0)
{
num=num/2;
n++;
}
else
{
num-=1;
n++;
}
}
return n;
}
阶乘后的零
int trailingZeroes(int n)
{
int res = 0;
// 5 的个数就是 n / 5 + n / 25 + n / 125 ...
while (0 < n)
{
res += n / 5;
n /= 5;
}
return res;
}
罗马数字转整数
int romanToInt(char * s)
{
int count = 0;
while (*s)
{
if (*s == 'V')
count += 5;
else if (*s == 'L')
count += 50;
else if (*s == 'D')
count += 500;
else if (*s == 'M')
count += 1000;
else if (*s == 'I')
count = (*(s + 1) == 'V' || *(s + 1) == 'X') ? count - 1 : count + 1;
else if (*s == 'X')
count = (*(s + 1) == 'L' || *(s + 1) == 'C') ? count - 10 : count + 10;
else
count = (*(s + 1) == 'D' || *(s + 1) == 'M') ? count - 100 : count + 100;
s++;
}
return count;
}
拿硬币
int minCount(int* coins, int coinsSize)
{
int sum = 0;
for(int i = 0; i < coinsSize; i++)
sum += (coins[i] + 1) / 2;
return sum;
}
欧几里得算法(求最大公约数)
#include<stdio.h>
int ComFactor(int m,int n);
int main()
{
int a,b;
printf("请输入两个正整数\n");
scanf("%d%d",&a,&b);
printf("最大公约数是:%d\n",ComFactor(a,b));
return 0;
}
int ComFactor(int m,int n)
{
int r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
return n;
}
判断单链表是否单调递增
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType; /*定义线性表的数据类型,假设为 int 型*/
typedef struct Node /*定义单链表的结点类型*/
{
DataType data;
struct Node *next;
} Node;
int Judgelist(Node *first);
int main()
{
int a[5]={2,1,3,4,5}; //判断的序列
Node*s=NULL,*r=NULL;
Node*first=(Node*)malloc(sizeof(Node));
r=first;
for(int i=0;i<5;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data=a[i];
r->next=s;r=s;
}
r->next=NULL;
int x;
x=Judgelist(first);
if(x==1)
{
printf("是单调递增的");
}
else
{
printf("不是单调递增的");
}
return 0;
}
int Judgelist(Node *first)
{
Node *p=first->next;
int flag;
while(p->next!=NULL)
{
if(p->data<p->next->data)
{
p=p->next;
flag=1;
}
else
{
flag=0;
break;
}
}
return flag;
}
判断两颗二叉树是否相似
typedef char DataType;
typedef struct BiNode
{
DataType data;
struct BiNode *lchild, *rchild;
}BiNode;
bool LikeTree( BiNode *b1, BiNode *b2 )
{
bool like1, like2;
if( b1 == NULL && b2 == NULL )
return true;
else
{
if( b1 == NULL || b2 == NULL )
return false;
else
{
like1 = likeTree(b1 -> lchild ,b2 -> lchild );
like2 = likeTree(b1 -> rchild ,b2 -> rchild );
return ( like1 && like2 );
}
}
}
平方数之和
bool judgeSquareSum(int c)
{
for( int a = 0; a <= sqrt(c);a++)
{
double b = sqrt ( c - a * a );
if( b == (int)b )
return true;
}
return false;
}
七桥问题(欧拉回路)
#include<stdio.h>
int EulerCircuit(int mat[4][4],int n); //函数声明,求通奇数桥的顶点个数
int main()
{
int mat[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,0},{2,1,0,0}};
int num=EulerCircuit(mat,4); //调用函数得到通奇数桥的顶点个数
if(num>=2) //两个以上的顶点通奇数桥
printf("有%d个地方通奇数桥,不存在欧拉回路\n",num);
else //没有顶点通奇数桥
printf("存在欧拉回路\n");
return 0;
}
int EulerCircuit(int mat[4][4],int n) //函数定义,二维数组作为形参
{
int i,j,degree,count=0; //count累计通奇数桥的顶点个数
for(i=0;i<n;i++) //依次累加每一行的元素
{
degree=0; //degree存储通过顶点i的桥数,初始化为0
for(j=0;j<n;j++)
{
degree=degree+mat[i][j]; //将通过顶点i的桥数 求和
}
if(degree%2!=0)
count++;
}
return count; //结束函数,将count返回到调用处
}
亲密字符串
bool buddyStrings(char * A, char * B)
{
int i,j;
int count = 0, pos,
len1 = strlen(A), len2 = strlen(B);
if(len1 == 0 && len2 == 0)
return false;
int temp[3]={1,2,3}; //记录不同字符的下标数组,起始值设为不相同
if(len1 != len2)
return false;
for(i = 0; i < len1;i++)
{
if(A[i] - B[i] != 0)
temp[count++] = i; //记录不同的位置
if(count > 2)
return false;
}
if(count == 1)
return false;
if(count == 2 && A[temp[0]] == B[temp[1]] && A[temp[1]] == B[temp[0]]) //两个位置不同,且互相相等。则返回true
return true;
else if(count == 0) //处理A,B全部相等,若出现重复则返回true
{
for(i = 0; i < len1; i++)
{
for(j = i+1; j < len1; j++) //循环判断是否有相等数
{
if(A[i] == A[j])
return true;
}
}
}
return false;
}
青蛙跳台阶
int numWays(int n)
{
int sum, i, a = 1, b = 2;
if(n == 0 || n == 1)
return 1;
if(n == 2)
return 2;
for(i = 2; i < n; i ++)
{
sum = ( a + b ) % 1000000007;
a = b;
b = sum;
}
return sum;
}
判断单链表是否递增
//设计算法判断单链表是否递增
#include<stdio.h>
#include<stdlib.h>
typedef struct slist
{
int data;
struct slist *next;
}list;
list* creatlist();//尾插法建立单链表
int judgelist(list *l);//判断链表是否有序
int main(void)
{
list *l = creatlist();
int x;
x = judgelist(l);
if(x == 1)
{
printf("是单调递增的");
}
else
{
printf("不是单调递增的");
}
return 0;
}
list* creatlist()
{
list *l;//创建头结点
l = (list *)malloc(sizeof(list));
l->next = NULL;
list *s;
list *r;//尾指针
r = l;//尾指针时刻指向尾结点
int x;
printf("请输入元素值:\n");
scanf("%d",&x);
while(x != 0)
{
s = (list *)malloc(sizeof(list));
s->data = x;
r->next = s;
r = s;//尾指针移动
scanf("%d",&x);
}
r->next = NULL;//尾结点赋空
return l;
}
int judgelist(list *l)
{
list *p = l->next ;//指向首个元素节点
int flag;
while(p->next != NULL)
{
if(p->data < p->next->data )
{
p = p->next ;
flag = 1;
}
else
{
flag = 0;
break;
}
}
return flag;
}
替换空格
char* replaceSpace(char* s)
{
int n = 0;
for(int i = 0; s[i] != '\0'; ++i)
++n;
char* res;
res = (char*)malloc(3 * (n + 3) * sizeof(char));
int k = 0;
for(int i = 0; i < n; ++i)
{
if(s[i] != ' ')
res[k++] = s[i];
else
{
res[k++] = '%';
res[k++] = '2';
res[k++] = '0';
}
}
res[k] = '\0';
return res;
}
统计位数为偶数的个数
int findNumbers(int* nums, int numsSize)
{
int count = 0;
for(int i = 0; i < numsSize; i++)
{
if((nums[i] >= 10 && nums[i] < 100)||(nums[i] >= 1000 && nums[i] < 10000))
count ++;
}
return count;
}
完美数
bool checkPerfectNumber(int num)
{
if( num == 0 || (num == 1))
return false;
int i, sum = 1, sq = sqrt(num);
for (i = 2; i < sq; ++i)
if (num % i == 0)
sum += i + num / i;
if (num % sq == 0)
sum += (num / sq == sq) ? sq : sq + num / sq;
return sum == num;
}
完全平方数
//完全平方数可以通过累加从1往后的奇数找到,
//
//1 = 1;
//4 = 1 + 3;
//9 = 1 + 3 + 5;
//16 = 1 + 3 + 5 + 7;
//...
bool isPerfectSquare(int num)
{
if (num == 0 )
return false;
int i = 1;
while ( num > 0){
num -= i;
i += 2;
}
return num == 0;
}
无头尾循环链表删除前一个结点
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}Node;
int Delete(Node *s,DataType *ptr)
{
Node *p = NULL,*q = NULL;
p = s;
while(p->next->next != s)
{
p = p->next;
}
q = p->next;
*ptr = q->data;
p->next = s;
free(q);
return 1;
}
相同的数
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if( p == NULL && q == NULL )
return ture;
else
{
if( p == NULL || q == NULL )
return false;
else
{
if( p->val == q->val )
return isSameTree( p->left, q->left)&&isSameTree( p->right, q->right);
else return false
}
}
}
旋转数组
void rotate(int* nums, int numsSize, int k)
{
int i = 0, j = 0, temp = 0;
k %= numsSize; //旋转小于numsSize的长度
for (i = 0, j = numsSize - 1 - k; i<j; i++, j--) //对前半部分逆置
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
for (i = numsSize - k, j = numsSize - 1; i<j; i++, j--) //对后半部分逆置
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
for (i = 0, j = numsSize-1; i<j; i++, j--) //对整体数组逆置
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
硬币排列
int arrangeCoins(int n)
{
return (int)(Math.sqrt(2) * Math.sqrt(n+0.125)-0.5);
}
拥有最多糖果的孩子
/*给你一个数组?candies?和一个整数?extraCandies?,其中?candies[i]?代表第 i 个孩子拥有的糖果数目。
对每一个孩子,检查是否存在一种方案,将额外的?extraCandies?个糖果分配给孩子们之后,此孩子有 最多?的糖果。注意,允许有多个孩子同时拥有 最多?的糖果数目。
?
示例 1:
输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true]
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
示例 2:
输入:candies = [4,2,1,1,2], extraCandies = 1
输出:[true,false,false,false,false]
解释:只有 1 个额外糖果,所以不管额外糖果给谁,只有孩子 1 可以成为拥有糖果最多的孩子。
示例 3:
输入:candies = [12,1,12], extraCandies = 10
输出:[true,false,true]
?
提示:
2 <= candies.length <= 100
1 <= candies[i] <= 100
1 <= extraCandies <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kids-with-the-greatest-number-of-candies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
bool* kidsWithCandies(int* candies, int candiesSize, int extraCandies, int* returnSize)
{
int i;
int maximum = 0;
bool *output = (bool *)malloc(sizeof(bool) * candiesSize);
// 遍历每个小孩子的糖果数量,找到糖果数量最大值 maximum
for(i=0;i<candiesSize;i++)
{
if(candies[i] > maximum) maximum = candies[i];
}
// 把额外的糖果数量 extraCandies 只分给一个小孩,
// 找到此时糖果总数量 大于等于 糖果数量最大值 的小孩,标记true,其余标记false
for(i=0;i<candiesSize;i++)
{
if (candies[i] + extraCandies >= maximum)
output[i] = true;
else
output[i] = false;
}
*returnSize = candiesSize;
return output;
}
有效的括号
bool isValid(char * s)
{
if(*s == 0) return true; // 空字符串符合
int len = strlen(s);
if(len & 1) return false; // 奇数长度的字符串不符合
char stack[len];
int top = -1;
for(int i=0; i<len; i++) // 如果是左括号入栈
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
stack[++top] = s[i];
else // 不是左括号
if(top == -1)
return false;
else if(s[i] == stack[top]+1 || s[i] == stack[top]+2)
//ASCII表中,左括号与它对应的有括号ASCII值相差不超过2
//()为40,41;【】为90,93;{}为123,125
stack[top--] = 0;
else
return false;
}
return top == -1;// 最后栈为空则符合,不为空则不符合
}
整数的各位积和之差
int subtractProductAndSum(int n)
{
int add = 0, mul = 1;
while(n > 0)
{
int a = n % 10;
n /= 10;
add +=a;
mul *=a;
}
return mul - add;
}
种花
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n)
{
int gap=1,i;
for( i = 0; i < flowerbedSize; i++)
{
if( flowerbed[i] == 0 )
gap++;
else
{
n = n - ( gap - 1 ) / 2;
gap = 0;
}
}
if( gap != 0 )
n = n - gap / 2;
return n<=0;
}
最小的k个数
int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize)
{
int temp;
for(int i = 0; i < k;i++)
{
for(int j = i+1; j<arrSize;j++)
{
if(arr[i]>arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
int *a;
a = (int *)malloc(sizeof(int)*k);
for(int i = 0; i<k; i++)
{
a[i] = arr[i];
}
*returnSize = k;
return a;
}
左移字符串
/*C字符串要多一个单元存放‘\0’,不然会溢出*/
char* reverseLeftWords(char* s, int n)
{
if(s[0] == '\0' || n <= 0)
return s;
int i = strlen(s);
char *p = malloc(sizeof(char)*(i+1));
for(int j = 0; j < i - n; j++)
p[j] = s[n+j];
for(int k = 0; k < n; k++)
p[i - n + k] = s[k];
p[i] = '\0';
return p;
}
总结
这里对文章进行总结:
以上就是C语言简单程序练习的笔记,本文只是简单记录。