leecode C语言刷题记录-只出现一次的数字&快乐数

leecode C语言刷题记录-只出现一次的数字&快乐数


本文仅用于学习记录。

136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
法一:记录元素次数,找出只出现一次 的元素

int singleNumber(int* nums, int numsSize) {
    
    for(int i=0;i<numsSize;i++)
    {
        int count=0;
        for(int j=0;j<numsSize;j++)
        {
            if(nums[i]==nums[j])count++;

        }
        if(count==1)return nums[i];
    }
    return -1;
    
}

法二:按位异或所有元素

int singleNumber(int* nums, int numsSize) {
    int a=nums[0];
    for(int i=1;i<numsSize;i++)
    {
        a^=nums[i];
    }
    return a;
    
}

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
法一:函数Pinfang求平方和,
一个数算Pinfang一次,另一个数Pinfang二次,在不为1的情况下,两数相等代表有循环,不是快乐数。

int Pinfang(int x)
{
    int tem=x,ge,sum=0;
    while(tem!=0)
    {
        ge=tem%10;
        sum+=(ge*ge);
        tem/=10;

    }
    return sum;
}
bool isHappy(int n) {
    int t=n;
    int a=Pinfang(n),b=Pinfang(a);
    while(b!=1)
    {
        if(a==b)return false;
        a=Pinfang(a);
        b=Pinfang(b);b=Pinfang(b);
        
    }
    return true;
    
}

法二:,记录每次的历史值,并比较是否是已存在的数

int Pinfang(int x)
{
    int tem=x,ge,sum=0;
    while(tem!=0)
    {
        ge=tem%10;
        sum+=(ge*ge);
        tem/=10;

    }
    return sum;
}
int history[10001];
bool contain(int * his,int len,int val)
{
    for(int i=0;i<len;i++)
    {
        if(val==his[i])return true;
    }
    return false;
}
bool isHappy(int n) {
    if(n==1)return true;
    int t=n;
    int count=0;
    history[count++]=n;
    while(!contain(history,count,Pinfang(t)))
    {
        if(Pinfang(t)==1)return true;
        t=Pinfang(t);
        history[count++]=t;
        count++;

    }           
    
    return false;
    
}
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值