题目一描述:
给定一个整数n,判断其是否是3的幂次方
题目传送门
给定一个整数n判断其是否是4的幂次方
题目传送门
题目一分析:
同一种类型的题目判断一个整数是不是一个数的n次幂,自从学了计算机,是我慢慢的变得像计算机一样思考问题,总想着循环递归解决这个问题,而没想着大多数的问题使用数学就可以计算。
x^k = n就可以的出k = logx(n),java的lang包中的Math类中有log10(int num)因此采用换底公式logx(n) = log10(n)/log10(x)
代码如下:
class Solution {
public boolean isPowerOfThree(int n) {
return changeBasic(n);
}
//方式一
//递归求解
public boolean getFlag(int n){
if(n==1)return true;
if(n%3!=0||n==0)return false;
else return isPowerOfThree(n/3);
}
//方式二:数学计算
public boolean changeBasic(int n){
double temp = Math.log10(n)/Math.log10(3);
return (temp-(int)temp)==0;
}
}
四的幂:
class Solution {
public boolean isPowerOfFour(int num) {
return getPower(num);
}
public boolean getPower(int num){
if(num == 1)return true;
if(num%4!=0||num==0)return false;
return getPower(num/4);
}
public boolean getFour(int num){
double temp = Math.log10(num)/Math.log10(4);
return temp - (int)temp ==0;
}
}
题目二描述:
给定两个数组,求两个数组的交集。
输入:nums1 = {1,2,2,1} nums2 = {2,2}
输出:result = {2}
题目传送门
题目二分析:
对于两个数组的交集,不熟悉集合API时,可以自己将第一个数组放在集合中,第二个数组进行遍历匹配,将相同的元素放入一个新的集合中,放入集合的原因是交集的个数是未知的。
如果对集合的API熟悉,那么在Set集合中有一个方法为retainAll,因此可以将两个数组转为set集合进行处理。
代码如下:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
return getsection(nums1,nums2);
}
//方式一:
//最基本的方式
public int[] getinter(int[] nums1,int[] nums2 ){
//存放数组1的元素
Map<Integer,Integer> map = new HashMap<>();
//放交集的集合
List<Integer> list = new ArrayList();
//将数组1元素放入集合
for(int i=0;i<nums1.length;i++){
if(!map.containsKey(nums1[i])) map.put(nums1[i],0);
}
//将数组2进行对比
for(int i=0;i<nums2.length;i++ ){
if(map.containsKey(nums2[i]))
map.put(nums2[i],map.get(nums2[i])+1);
}
//遍历map集合,大于0的认为是交集
Iterator ii = map.keySet().iterator();
while(ii.hasNext()){
Integer temp = (Integer)ii.next();
if(map.get(temp)>0)list.add(temp);
}
//返回数组,将交集集合中的元素放入数组
int[] arr = new int[list.size()];
for(int i=0;i<arr.length;i++) {
arr[i] = list.get(i);
}
return arr;
}
//方式二
//对API熟悉的方式
public int[] getsection(int[] nums1,int[] nums2){
//将数组转为两个set集合处理
Set<Integer> set1 = new HashSet();
Set<Integer> set2 = new HashSet();
for(int i=0;i<nums1.length;i++)set1.add(nums1[i]);
for(int i=0;i<nums2.length;i++)set2.add(nums2[i]);
//使用方法retainAll方法求交集
set1.retainAll(set2);
int[] res = new int[set1.size()];
//将交集元素放入数组
int k = 0;
for(int s:set1) res[k++] = s;
return res;
}
}