java每日练习_day2

本人是一个初入java冷遇的一名小白,所以每天会练习几个java题,每一段代码有自己写的,有从网上借鉴的,由于来源已经记不清了,所以只能在这里表示感谢。这只是一个java小白日常笔记,可以给予一些和我一样的小白提供解题思路,所以大神们请手下留情~~
——————————————————————————————

  1. 最大乘积
  2. 数字转换为十六进制数
  3. 计数质数
  4. 可被5整除的二进制前缀
  5. 完美数
  6. 最长连续递增序列
  7. 求数组中两两相加等于20的组合数
  8. 找出数组中重复元素最多的数
    具体内容:
    1. 题目描述
    给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
private static long maximumProduct(int[] nums) {
		//(1)最大的三个数之乘积或者是(2)两个最小负数和最大整数的乘积
		 int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE, min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
	        for (int n : nums) {
	            if (n > max1) {
	                max3 = max2;
	                max2 = max1;
	                max1 = n;
	            } else if (n > max2) {
	                max3 = max2;
	                max2 = n;
	            } else if (n > max3) {
	                max3 = n;
	            }
	   
	            if (n < min1) {
	                min2 = min1;
	                min1 = n;
	            } else if (n < min2) {
	                min2 = n;
	            }
	        }
	        return Math.max((long)max1*max2*max3, (long)max1*min1*min2);
	}

2. 给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入:26
输出:“1a”
示例 2:
输入:-1
输出:“ffffffff”

 public String toHex(int num) {
     if (num == 0)
			return "0";
		char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
		StringBuilder sb = new StringBuilder();
		while (sb.length() < 8 && num != 0) {
			sb.append(chars[num & 0xf]);
			num >>= 4;
		}
		return sb.reverse().toString();
    }

3. 统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

public static int countPrimes(int n) {
		if(n<=1) {
			return 0;
		}
		//小于n的质数个数
		//将角标是质数的定义为false,查个数
		boolean [] mark=new boolean[n];
		mark[0]=true;
		mark[1]=true;
		for(int i=2;i*i<n;i++) {
			if(!mark[i]) {
				for(int j=2*i;j<n;j+=i) {
					mark[j]=true;
				}
			}
		}
		int count=0;
		for(boolean m:mark) {
			if(!m) {
				count++;
			}
		}
		return count;
    }

4. 给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。
示例 1:
输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。
示例 2:
输入:[1,1,1]
输出:[false,false,false]
示例 3:
输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]
示例 4:
输入:[1,1,1,0,1]
输出:[false,false,false,false,false]

public static List<Boolean> prefixesDivBy5(int[] A) {
		 List<Boolean> result =new ArrayList<>(A.length);
	        long num = 0;
	        for(int i=0;i<A.length;i++){
	        	num = (num*2+A[i]);
	        	System.out.println(num);
	            //num = (num*2+A[i])%10;
	            //System.out.println(num);
	            
	            if(num%5==0){
	                result.add(true);
	            }else {
	                result.add(false);
	            }
	        }
	        return result;
    }

5. 对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。
给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False
示例:
输入: 28
输出: True
解释: 28 = 1 + 2 + 4 + 7 + 14

public static boolean checkPerfectNumber(int num) {
		 int sum = 1;
	        for(int i = 2; i < num/i; i++)
	            if(num%i == 0)
	                sum += i + num/i;
	        return num!=1 && sum==num;
    }

6. 给定一个未经排序的整数数组,找到最长且连续的的递增序列。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。
示例 2:
输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。

public static int findLengthOfLCIS(int[] nums) {
		 if(nums.length<=1) {
			 return nums.length;
		 }
		 int count=1;
		 int max=1;
		 for(int x=0;x<nums.length-1;x++) {
			 
			 if(nums[x+1]>nums[x]) {
				 count++;
				
			 }else {
				 count=1;
			 }
			 if(count>max) {
				 max=count;
			 }
		 }
		return max;
	   }

7. 求数组中两两相加等于20的组合数
示例:{1,7,17,2,6,3,14}
[3,17] [6,14]

private static void finSum(int[] arr) {
		//先进行数组排序,算法最低为(o(nlogn))
		Arrays.sort(arr);
		int start=0;
		int end=arr.length-1;
		while(start<end) {
			if(arr[start]+arr[end]>20) {
				end--;
			}else if(arr[start]+arr[end]<20) {
				start++;
			}else {
				System.out.println("["+arr[start]+","+arr[end]+"]");
				start++;
				end--;
			}
		}
	}

8. 示例:
{1,5,4,3,4,4,5,4,5,6,6,6,6,6,6,6}

private static int findMostFrequencyInArray(int[] nums) {
		Map<Integer,Integer> mp=new HashMap<>();
		//将数字和出现个数放在map集合中
		for(int i=0;i<nums.length;i++) {
			if(mp.containsKey(nums[i])) {
				mp.put(nums[i], mp.get(nums[i])+1);
			}else {
				mp.put(nums[i], 1);
			}
		}
		//System.out.println(mp);
		//找到出现次数的最大值
		int max=0;
		int result=0;
		Iterator it=mp.entrySet().iterator();
		while(it.hasNext()) {
			Map.Entry<Integer, Integer> entry=(Entry<Integer, Integer>) it.next();
			int key=entry.getKey();
			int value=entry.getValue();
			if(value>max) {
				result=key;
				max=value;
			}
		}
		return result;
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值