判断是否为丑数
public class Solution {
public bool IsUgly(int num) {
//判断一个数是否为丑数
if(num < 1) return false;
while(num % 2 == 0) num /= 2;
while(num % 3 == 0) num /= 3;
while(num % 5 == 0) num /= 5;
return num == 1;
}
}
思路:因为丑数的质因数只包含2、3、5.所以直接进行除,得到最后的数字判断是否为1即可。
丑数II
public class Solution {
public int NthUglyNumber(int n) {
//可以使用动态规划的思想,由于N不超过1690,所以预算1690个丑数,
//使用3个下标“指针”来进行标记要相乘的因子,通过比较2*nums[i],3*nums[i], 5*nums[i]的最小值放入丑数数组中
if(n == 1) return 1;
Ugly u = new Ugly(n);
return u.nums[n - 1];
}
}
public class Ugly
{
public int[] nums = new int[1690];
public Ugly(int n)
{
//第一个丑数
nums[0] = 1;
int ugly = 0;
int index2 = 0;
int index3 = 0;
int index5 = 0;
for(int i = 1; i < n; i++)
{
ugly = Math.Min(Math.Min(nums[index2] * 2, nums[index3] * 3), nums[index5] * 5);
nums[i] = ugly;
if(ugly == nums[index2] * 2) index2++;
if(ugly == nums[index3] * 3) index3++;
if(ugly == nums[index5] * 5) index5++;
}
}
}
思路:
本题解法需要用到动态规划的知识,由于丑数是质因子只为2、3、5。
我们用一个数字来保存丑数集合,且第一个丑数为1。通过循环吧最小的放入到丑数数组中,在不断移动下标,最后存入所有丑数。
缺失数字
public class Solution {
public int MissingNumber(int[] nums) {
/* int len = nums.Length;
int sum = (len * (len + 1)) / 2;
foreach(var item in nums)
sum -= item;
return sum;*/
//位运算
int res = 0;
for(int i = 0; i < nums.Length; i++)
{
res ^= i ^ nums[i];
}
return res ^ nums.Length;
}
}
思路:
本题有两种思路,因为数字是0-n的,所以可以通过等差数列求和的方法来进行将所有数字相加,减去原数组中的数字,剩下的就是缺失的数字。
还可以通过位运算异或操作符,每次异或的值存在res中,最后res与数组长度异或即可。