前言Weekly Contest 118的 强整数:给定两个非负整数 x 和 y,如果某一整数等于 x^i + y^j,其中整数 i >= 0 且 j >= 0,那么我们认为该整数是一个强整数。返回值小于或等于 bound 的所有强整数组成的列表。你可以按任何顺序返回答案。在你的回答中,每个值最多出现一次。示例1:输入:x = 2, y = 3, bound = 10输出:[2,3,4,5,7,9,10]解释: 2 = 2^0 + 3^03 = 2^1 + 3^04 = 2^0 + 3^15 = 2^1 + 3^17 = 2^2 + 3^19 = 2^3 + 3^010 = 2^0 + 3^2示例2:输入:x = 3, y = 5, bound = 15输出:[2,4,6,8,10,14]提示:1 <= x <= 1001 <= y <= 1000 <= bound <= 10^6解题思路本题只需要找出正整数中满足x^i + y^j且<=bound的数即可,所以只需要用两重for循环找出满足条件的数字即可。注意事项:循环中会出现重复的值,例如输入:x = 2, y = 3, bound = 10输出:[2,3,4,5,7,9,10]解释: 2 = 2^0 + 3^03 = 2^1 + 3^04 = 2^0 + 3^15 = 2^1 + 3^15 = 2^2 + 3^07 = 2^2 + 3^19 = 2^3 + 3^010 = 2^0 + 3^2其中重复的情况为5 = 2^1 + 3^15 = 2^2 + 3^0可以选择先使用Set进行结果去重执行超时的情况,例如输入:x = 1, y = 3, bound = 100。所以可以选择循环次数为bound(x^bound>bound恒成立),而不是Integer.MAX_VALUE。实现代码 /** * 970. 强整数 * @param x * @param y * @param bound * @return */ public List<Integer> powerfulIntegers(int x, int y, int bound) { //选择使用Set是因为结果中会出现重复值 Set<Integer> set = new HashSet<>(); //循环次数为bound,而不是Integer.MAX_VALUE,防止执行超时 for (int i = 0; i < bound; i++) { int tmp1 = (int) Math.pow(x, i); //如果第一个数就大于bound,直接中断循环,防止执行超时 if (tmp1 > bound) { break; } //循环次数为bound,而不是Integer.MAX_VALUE,防止执行超时 for (int j = 0; j < bound; j++) { int tmp2 = (int) (Math.pow(y, j)); int tmp = tmp1 + tmp2; //判断是否超出bound if (tmp <= bound) { set.add(tmp); } else {//超出bound直接中断循环,因为后续的数字都会超出bound break; } } }