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;
}