C语言学习--编程的魅力

目录

1.各位相加

2.n的第k个因子

3.有效的完全平方数

4.爬楼梯

5.绝对值为k的数对数目

6.拿硬币

7.重新排列数组

8.一维数组的动态和

9.动态口令


1.各位相加

cpp 复制代码
int addDigits(int num) {
    while(1){
        int sum=0;
        while(num){
            sum=sum+num%10;//一直加个位
            num=num/10;
    }
        num=sum;
        if(sum<10){
            return sum;
        }
    }//of while
}

2.n的第k个因子

cpp 复制代码
int kthFactor(int n, int k) {
    int j=0;
    for(int i=1;i<=n;i=i+1){
        if(n%i==0){
            j=j+1;
        }
        if(k==j){
            return i;
        }
    }
    return -1;
}
//在循环中满足一定的条件然后退出这种思想,非常重要。

3.有效的完全平方数

cpp 复制代码
bool isPerfectSquare(int num) {
    long i=1;
    for(;i<=num;i++){
        if (i * i > num) 
            break;
        if(i*i==num){
            return true;
        }
    }
    return false;
}

4.爬楼梯

cpp 复制代码
int climbStairs(int n) {
    int a[46];
    a[0]=1;
    a[1]=1;
    for(int i=2;i<=n;i++){
        a[i]=a[i-1]+a[i-2];
    }
    return a[n];
}

//递归的思想非常重要,如何做到问题简单化,具体分析

int climbStairs(int n) {
    if(n <= 3)
    {
        return n;
    }
    else
    {
        return climbStairs(n-1) + climbStairs(n-2);
    }
}

5.绝对值为k的数对数目

cpp 复制代码
int countKDifference(int* nums, int numsSize, int k) {
    int a=0;
    for(int i=0;i<numsSize;i++){
        for(int j=i+1;j<numsSize;j++){
            if(abs(nums[i]-nums[j])==k){
                a++;
            }
        }
    }
    return a;
}
//引用库#include <stdlib.h>
/*
abs(x):整数x的绝对值。abs( int x );int abs(int x) ;!!!

fabs(x):浮点数(小数)x的绝对值。fabs( double x );double fabs(double x),精确到双精度浮点型。

pow(a, x):a的x次方,即a^x,a和x是浮点数,返回值是浮点数(即使a和x都是整数,也会被转换成浮点数,因此整数运算可能损失精度,造成误差)。!!!

exp(x):e的x次方,即e^x,x是浮点数,e是自然对数的底数(一个无理数,值为2.71828。.)

*/

6.拿硬币

cpp 复制代码
int game(int* guess, int guessSize, int* answer, int answerSize){
    int i=0;
    int j=0;
    while(i<guessSize){
        if(guess[i]==answer[i]){
            j++;
        }
        i++;
    }
    return j;
}

7.重新排列数组

cpp 复制代码
//1.刚开始做的时候脑阔很复杂,取出来之后再插入,其实可以直接插入的

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
    int* p=(int*)malloc(sizeof(int*)*n*2);
    int a[numsSize/2];
    int b[numsSize/2];
    for(int i=0;i<numsSize/2;i++){
        a[i]=nums[i];
    }
    int j;
    int i;
    int k;
    for(i=(numsSize/2),j=0;i<numsSize;i=i+1,j++){
        b[j]=nums[i];
    }
    
    for(i=0,j=0,k=0;i<numsSize;i++){
        if(i%2==0){
            p[i]=a[j];
            j++;
        }else{
            p[i]=b[k];
            k++;
        }
    }
    * returnSize=numsSize;
    return p;

}
cpp 复制代码
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
    int* p=(int*)malloc(sizeof(int*)*n*2);
    for(int i=0;i<numsSize;i++){
        if(i%2==0){//偶数位是前x1--xn
            p[i]=nums[i/2]; 
        }else{
            p[i]=nums[(i-1)/2+n];
        }
    }
    * returnSize=numsSize;
    return p;

}
/*今天学到了一种另外一种判别奇偶的方法
if(i&1){
    i为奇数
}else{
    i为偶数
}
*/

8.一维数组的动态和

cpp 复制代码
int* runningSum(int* nums, int numsSize, int* returnSize){
    int* a=(int *)malloc(sizeof(int)*numsSize);
    for(int j=0;j<numsSize;j++){
            a[j]=0;
        }//数组建议初始化,否则会出现脏数据
    for(int i=0;i<numsSize;i++){
        for(int j=0;j<=i;j++){
            a[i]=a[i]+nums[j];
        }
    }
    * returnSize=numsSize;
    return a;
}//其实O(n^2)的时间复杂度很复杂了
cpp 复制代码
int* runningSum(int* nums, int numsSize, int* returnSize){
    int *ret = (int *)malloc(sizeof(int) * numsSize);
    for(int i = 0; i < numsSize; i++){
        if(i == 0){
            ret[0] = nums[0];
        }else{
            ret[i] = ret[i-1] + nums[i];}
    }
    * returnSize = numsSize;
    return ret;
}
//这种就是直接循环一次,想到了本项就是前一项与原数组本项的和

9.动态口令

cpp 复制代码
char* dynamicPassword(char* password, int target) {
    char* a = (char*)malloc(sizeof(char) * target);
    for(int i = 0; i < target; i++) {
        a[i] = password[i];
    }

    int len = strlen(password);
    for(int i = target; i < len; i++) {
        password[i - target] = password[i];
    }

    for(int i = len - target; i < len; i++) {
        password[i] = a[i - len + target];
    }

    return password;
}
//真的是数据结构学迷糊了,天天想着移动顺序表

看看别人是怎么解的,真的据聪明,

cpp 复制代码
char* dynamicPassword(char* password, int target) {
    int i;
    int n=strlen(password);
    char *ret=(char *)malloc((n+1) * sizeof(char));
    for(i=0;i<n;++i)
    {
        ret[i]=password[(i+target)%n];
    }
    ret[n]='\0';
    return ret;
}
//真的不理解为什么最后要加上\n来结束字符串
相关推荐
居然是阿宋11 分钟前
【学习笔记】OkHttp源码架构解析:从设计模式到核心实现
笔记·学习·okhttp
水果里面有苹果21 分钟前
18-C#改变形参内容
java·数据结构·算法
想成为大佬的每一天31 分钟前
Linux驱动学习day20(pinctrl子系统驱动大全)
学习
草莓熊Lotso39 分钟前
【洛谷题单】--顺序结构(一)
c语言·c++·其他·刷题
lightqjx40 分钟前
【数据结构】复杂度分析
c语言·开发语言·数据结构·算法
程序员小白条2 小时前
我的第二份实习,学校附近,但是干前端!
java·开发语言·前端·数据结构·算法·职场和发展
不太可爱的叶某人9 小时前
【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
笔记·学习·mysql
岁岁岁平安9 小时前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
黑听人11 小时前
【力扣 困难 C】329. 矩阵中的最长递增路径
c语言·leetcode
知识分享小能手11 小时前
Vue3 学习教程,从入门到精通,使用 VSCode 开发 Vue3 的详细指南(3)
前端·javascript·vue.js·学习·前端框架·vue·vue3