当前位置:   article > 正文

力扣算法题解析_力扣的解析

力扣的解析

目录

一、第9题,难度:简单

1、题目描述

2、个人解法

3、官方解法

二、罗马数字转数字

1、个人解法

2、官方解法

三、第14题,难度:简单

1、题目描述

2、个人解法

3、官方解法

四、第20题 难度:简单

1、题目描述

2、个人解法

3、官方解法

五、第58题:最后一个单词的长度,难度:简单

1、题目描述

2、个人解法

3、官方解法

六、第66题:加一,难度:简单

1、题目描述

2、个人解法

3.官方解法

七、第69题:x的平方根,难度:简单

1、题目描述

2、个人解法

3、官方解法

八、第125题:验证回文数,难度:简单

1、题目描述

2、个人解法

3、官方解法

九、第35题:搜索插入位置,难度:简单

1、题目描述

2、个人解法

3、官方解法

十、第374题:猜数字大小

1、题目描述

2、个人解法

3、官方解法


一、第9题,难度:简单

1、题目描述

/**
 * 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
 *
 * 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
 *
 * 例如,121 是回文,而 123 不是。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/palindrome-number
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * @param x 整数x
 * @return 是否为回文数
 */

2、个人解法

解法1、转化为字符数组前后对比

执行用时:6 ms, 在所有 Java 提交中击败了41.76%的用户

内存消耗:41.4 MB, 在所有 Java 提交中击败了7.44%的用户

  1. public static boolean isPalindrome(int x) {
  2. char[] xStrArr = (x+"").toCharArray();
  3. int xStrArrLen=xStrArr.length;
  4. for (int i = 0; i < xStrArrLen/2; i++) {
  5. if(xStrArr[i]!=xStrArr[xStrArrLen-i-1]){
  6. return false;
  7. }
  8. }
  9. return true;
  10. }

解法2:直接比较

执行用时:14 ms, 在所有 Java 提交中击败了5.62%的用户

内存消耗:41.3 MB, 在所有 Java 提交中击败了12.85%的用户

  1. public static boolean isPalindrome(int x) {
  2. boolean flag=true;
  3. if (x<0){
  4. return false;
  5. }
  6. String xStr=x+"";
  7. int xLen=xStr.length();
  8. String step="1";
  9. for (int i = 0; i < xLen-1; i++) {
  10. step=step+"0";
  11. }
  12. int xInt = Integer.parseInt(step);
  13. for (int i = 0; i < xLen/2; i++) {
  14. if (x%10!=x/xInt){
  15. flag=false;
  16. break;
  17. }else {
  18. x=((x%xInt)/10);
  19. xInt=xInt/100;
  20. }
  21. }
  22. return flag;
  23. }

解法3:字符串反转

执行用时:8 ms, 在所有 Java 提交中击败了13.25%的用户

内存消耗:41 MB, 在所有 Java 提交中击败了43.19%的用户

  1. public static boolean isPalindrome(int x) {
  2. StringBuilder xStr = new StringBuilder(x+"");
  3. return xStr.reverse().toString().equals(x + "");
  4. }

3、官方解法

  1. /**
  2. 作者:LeetCode-Solution
  3. 链接:https://leetcode.cn/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/
  4. 来源:力扣(LeetCode)
  5. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  6. */
  7. public boolean isPalindrome(int x) {
  8. // 特殊情况:
  9. // 如上所述,当 x < 0 时,x 不是回文数。
  10. // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
  11. // 则其第一位数字也应该是 0
  12. // 只有 0 满足这一属性
  13. if (x < 0 || (x % 10 == 0 && x != 0)) {
  14. return false;
  15. }
  16. int revertedNumber = 0;
  17. while (x > revertedNumber) {
  18. revertedNumber = revertedNumber * 10 + x % 10;
  19. x /= 10;
  20. }
  21. // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
  22. // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
  23. // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
  24. return x == revertedNumber || x == revertedNumber / 10;
  25. }

二、罗马数字转数字

1、个人解法

  1. {
  2. String[] numMapArr=new String[]{"I", "V", "X", "L", "C", "D","M","a","b","c","d","e","f"};
  3. Integer[] numMapsArr=new Integer[]{1, 5, 10, 50, 100, 500,1000,4, 9, 40, 90, 400, 900};
  4. String[] specialNumArr=new String[]{"IV", "IX", "XL", "XC", "CD", "CM"};
  5. String[] specialNumsArr=new String[]{"a", "b", "c", "d", "e", "f"};
  6. String res=s;
  7. for (int i = 0; i < specialNumArr.length; i++) {
  8. res=res.replace(specialNumArr[i],specialNumsArr[i]);
  9. }
  10. Map<String,Integer> numMap=new HashMap<>();
  11. for (int i = 0; i < numMapArr.length; i++) {
  12. numMap.put(numMapArr[i],numMapsArr[i]);
  13. }
  14. int resN=0;
  15. for (int i = 0; i < res.length(); i++) {
  16. resN=resN+ numMap.get(res.charAt(i)+"");
  17. }
  18. return resN;
  19. }

2、官方解法

  1. Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{
  2. put('I', 1);
  3. put('V', 5);
  4. put('X', 10);
  5. put('L', 50);
  6. put('C', 100);
  7. put('D', 500);
  8. put('M', 1000);
  9. }};
  10. public int romanToInt(String s) {
  11. int ans = 0;
  12. int n = s.length();
  13. for (int i = 0; i < n; ++i) {
  14. int value = symbolValues.get(s.charAt(i));
  15. if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {
  16. ans -= value;
  17. } else {
  18. ans += value;
  19. }
  20. }
  21. return ans;
  22. }
  23. 作者:LeetCode-Solution
  24. 链接:https://leetcode.cn/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-by-leetcod-w55p/
  25. 来源:力扣(LeetCode)
  26. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、第14题,难度:简单

1、题目描述

/**
 * 编写一个函数来查找字符串数组中的最长公共前缀。
 *
 * 如果不存在公共前缀,返回空字符串""。
 *
 * 示例 1:
 *
 * 输入:strs = ["flower","flow","flight"]
 * 输出:"fl"
 * 示例 2:
 *
 * 输入:strs = ["dog","racecar","car"]
 * 输出:""
 * 解释:输入不存在公共前缀。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/longest-common-prefix
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * @param strs
 * @return
 */

2、个人解法

执行用时:4 ms, 在所有 Java 提交中击败了11.92%的用户

内存消耗:41.3 MB, 在所有 Java 提交中击败了5.02%的用户

  1. public static String longestCommonPrefix(String[] strs) {
  2. String res="";
  3. int strsLen=strs.length;
  4. int minLen=strs[0].length();
  5. List<String> resList=new ArrayList<>();
  6. for (int i = 1; i < strsLen; i++) {
  7. if (minLen>strs[i].length()){
  8. minLen=strs[i].length();
  9. }
  10. }
  11. for (int j = 0; j < minLen; j++) {
  12. for (int i = 0; i < strsLen; i++) {
  13. resList.add(strs[i].charAt(j)+"");
  14. }
  15. boolean flag=true;
  16. for (int s = 1; s < resList.size(); s++) {
  17. if (!(resList.get(0)).equals(resList.get(s))){
  18. flag=false;
  19. }
  20. }
  21. if (flag){
  22. res=res+resList.get(0);
  23. }else {
  24. return res;
  25. }
  26. resList.clear();
  27. }
  28. return res;
  29. }

3、官方解法

  1. public String longestCommonPrefix(String[] strs) {
  2. if (strs == null || strs.length == 0) {
  3. return "";
  4. }
  5. String prefix = strs[0];
  6. int count = strs.length;
  7. for (int i = 1; i < count; i++) {
  8. prefix = longestCommonPrefix(prefix, strs[i]);
  9. if (prefix.length() == 0) {
  10. break;
  11. }
  12. }
  13. return prefix;
  14. }
  15. public String longestCommonPrefix(String str1, String str2) {
  16. int length = Math.min(str1.length(), str2.length());
  17. int index = 0;
  18. while (index < length && str1.charAt(index) == str2.charAt(index)) {
  19. index++;
  20. }
  21. return str1.substring(0, index);
  22. }

四、第20题 难度:简单

1、题目描述

/**
 * 20. 有效的括号
 * 给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。
 * <p>
 * 有效字符串需满足:
 * <p>
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 每个右括号都有一个对应的相同类型的左括号。
 * <p>
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/valid-parentheses
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 * @param s
 * @return
 */

2、个人解法

模拟栈解法

执行用时:3 ms, 在所有 Java 提交中击败了11.46%的用户

内存消耗:39.4 MB, 在所有 Java 提交中击败了66.26%的用户

  1. public static boolean isValid(String s) {
  2. int sLen = s.length();
  3. if (sLen % 2 == 1) {
  4. return false;
  5. }
  6. Map<Character, Character> map = new HashMap<>();
  7. map.put('(', ')');
  8. map.put('[', ']');
  9. map.put('{', '}');
  10. List<Character> list = new ArrayList<>();
  11. for (int i = 0; i < sLen; i++) {
  12. if (map.containsKey(s.charAt(i))) {
  13. list.add(s.charAt(i));
  14. } else {
  15. if (list.size() != 0) {
  16. if (s.charAt(i) != map.get(list.get(list.size() - 1))) {
  17. return false;
  18. }
  19. list.remove(list.size() - 1);
  20. } else {
  21. return false;
  22. }
  23. }
  24. System.out.println("--" + list);
  25. }
  26. if (list.size() == 0) {
  27. return true;
  28. } else {
  29. return false;
  30. }
  31. }

3、官方解法

  1. public boolean isValid(String s) {
  2. int n = s.length();
  3. if (n % 2 == 1) {
  4. return false;
  5. }
  6. Map<Character, Character> pairs = new HashMap<Character, Character>() {{
  7. put(')', '(');
  8. put(']', '[');
  9. put('}', '{');
  10. }};
  11. Deque<Character> stack = new LinkedList<Character>();
  12. for (int i = 0; i < n; i++) {
  13. char ch = s.charAt(i);
  14. if (pairs.containsKey(ch)) {
  15. if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
  16. return false;
  17. }
  18. stack.pop();
  19. } else {
  20. stack.push(ch);
  21. }
  22. }
  23. return stack.isEmpty();
  24. }
  25. 作者:LeetCode-Solution
  26. 链接:https://leetcode.cn/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
  27. 来源:力扣(LeetCode)
  28. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

五、第58题:最后一个单词的长度,难度:简单

1、题目描述

/**
 * 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
 *
 * 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
 *
 * 示例 1:
 *
 * 输入:s = "Hello World"
 * 输出:5
 * 解释:最后一个单词是“World”,长度为5。
 * 示例 2:
 *
 * 输入:s = "   fly me   to   the moon  "
 * 输出:4
 * 解释:最后一个单词是“moon”,长度为4。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/length-of-last-word
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * @param s
 * @return
 */

2、个人解法

去掉字符串两边的空格,然后返回最后一个空格的位置到字符串结尾位置的长度。

0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:39.5 MB, 在所有 Java 提交中击败了78.57%的用户

  1. public static int lengthOfLastWord(String s) {
  2. s = s.trim();
  3. return s.substring(s.lastIndexOf(" ") + 1).length();
  4. }

3、官方解法

  1. class Solution {
  2. public int lengthOfLastWord(String s) {
  3. int index = s.length() - 1;
  4. while (s.charAt(index) == ' ') {
  5. index--;
  6. }
  7. int wordLength = 0;
  8. while (index >= 0 && s.charAt(index) != ' ') {
  9. wordLength++;
  10. index--;
  11. }
  12. return wordLength;
  13. }
  14. }

六、第66题:加一,难度:简单

1、题目描述

/**
 * 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
 *
 * 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
 *
 * 你可以假设除了整数 0 之外,这个整数不会以零开头。
 *
 * 示例1:
 *
 * 输入:digits = [1,2,3]
 * 输出:[1,2,4]
 * 解释:输入数组表示数字 123。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/plus-one
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * @param digits
 * @return
 */

2、个人解法

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:39.7 MB, 在所有 Java 提交中击败了79.14%的用户

  1. public int[] plusOne(int[] digits) {
  2. int len=digits.length;
  3. digits[len-1]+=1;
  4. for (int i = len-1; i >0; i--) {
  5. if(digits[i]==10){
  6. digits[i]=0;
  7. digits[i-1]+=1;
  8. }
  9. }
  10. if (digits[0]==10){
  11. int[] a=new int[len+1];
  12. a[0]=1;digits[0]=0;
  13. for (int i = 0; i < len; i++) {
  14. a[i+1]=digits[i];
  15. }
  16. return a;
  17. }
  18. return digits;
  19. }

3.官方解法

  1. public int[] plusOne(int[] digits) {
  2. int n = digits.length;
  3. for (int i = n - 1; i >= 0; --i) {
  4. if (digits[i] != 9) {
  5. ++digits[i];
  6. for (int j = i + 1; j < n; ++j) {
  7. digits[j] = 0;
  8. }
  9. return digits;
  10. }
  11. }
  12. // digits 中所有的元素均为 9
  13. int[] ans = new int[n + 1];
  14. ans[0] = 1;
  15. return ans;
  16. }
  17. 作者:LeetCode-Solution
  18. 链接:https://leetcode.cn/problems/plus-one/solution/jia-yi-by-leetcode-solution-2hor/
  19. 来源:力扣(LeetCode)
  20. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

七、第69题:x的平方根,难度:简单

1、题目描述

/**
 * 给你一个非负整数 x ,计算并返回x的 算术平方根 。
 * <p>
 * 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
 * <p>
 * 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
 * <p>
 * 示例 1:
 * <p>
 * 输入:x = 4
 * 输出:2
 * 示例 2:
 * <p>
 * 输入:x = 8
 * 输出:2
 * 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
 * <p>
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/sqrtx
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 * @param x
 * @return
 */

2、个人解法

解法1:从0开始平方

执行用时:22 ms, 在所有 Java 提交中击败了9.30%的用户

内存消耗:38.7 MB, 在所有 Java 提交中击败了58.13%的用户

  1. public static int mySqrt(int x) {
  2. int y=0;
  3. if (x>=2147395600){
  4. return 46340;
  5. }
  6. for (int i = 0; i < x+1; i++) {
  7. if (i*i==x){
  8. return i;
  9. }else if (i*i>x){
  10. return i-1;
  11. }
  12. System.out.println("i:"+i+",y:"+y);
  13. }
  14. return y;
  15. }

解法2 类似二分搜索

执行用时:7 ms, 在所有 Java 提交中击败了11.20%的用户

内存消耗:38.6 MB, 在所有 Java 提交中击败了79.20%的用户

  1. public static int mySqrt(int x) {
  2. int y = 0;
  3. if (x >= 2147395600) {
  4. return 46340;
  5. }
  6. if (x == 1 || x == 2) {
  7. return 1;
  8. }
  9. if (x == 0) {
  10. return 0;
  11. }
  12. int flag = 0;
  13. for (int i = x / 2; i < x + 1; i = i / 2) {
  14. if (i * i == x) {
  15. return i;
  16. } else if (i * i > x) {
  17. } else if (i < 46340) {
  18. flag = i;
  19. break;
  20. }
  21. }
  22. if (flag != 0) {
  23. for (int i = flag; i < x; i++) {
  24. if (i * i == x) {
  25. return i;
  26. } else if (i * i > x) {
  27. return i - 1;
  28. } else if (i >= 46340) {
  29. return 46340;
  30. }
  31. }
  32. }
  33. return y;
  34. }

3、官方解法

(另有二分查找法和牛顿迭代法)

  1. public int mySqrt(int x) {
  2. if (x == 0) {
  3. return 0;
  4. }
  5. int ans = (int) Math.exp(0.5 * Math.log(x));
  6. return (long) (ans + 1) * (ans + 1) <= x ? ans + 1 : ans;
  7. }
  8. 作者:LeetCode-Solution
  9. 链接:https://leetcode.cn/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
  10. 来源:力扣(LeetCode)
  11. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

八、第125题:验证回文数,难度:简单

1、题目描述

/**
 * 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
 *
 * 字母和数字都属于字母数字字符。
 *
 * 给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: s = "A man, a plan, a canal: Panama"
 * 输出:true
 * 解释:"amanaplanacanalpanama" 是回文串。
 * 示例 2:
 *
 * 输入:s = "race a car"
 * 输出:false
 * 解释:"raceacar" 不是回文串。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/valid-palindrome
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

2、个人解法

执行用时: 19 ms

内存消耗: 42.6 MB

先大写转小写,再根据ACSII码值替换不满足要求的字符

  1. public boolean isPalindrome(String s) {
  2. s = s.toLowerCase();
  3. for (int i = 0; i < s.length(); i++) {
  4. if (String.valueOf(s.charAt(i)).hashCode() < 48 || (String.valueOf(s.charAt(i)).hashCode() > 57 && String.valueOf(s.charAt(i)).hashCode() < 97) || String.valueOf(s.charAt(i)).hashCode() > 122) {
  5. s = s.replace(s.charAt(i) + "", " ");
  6. }
  7. }
  8. s = s.replaceAll(" ", "");
  9. StringBuilder str = new StringBuilder(s);
  10. return (str + "").equals((str.reverse() + ""));
  11. }

3、官方解法

双指针

  1. class Solution {
  2. public boolean isPalindrome(String s) {
  3. int n = s.length();
  4. int left = 0, right = n - 1;
  5. while (left < right) {
  6. while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
  7. ++left;
  8. }
  9. while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
  10. --right;
  11. }
  12. if (left < right) {
  13. if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
  14. return false;
  15. }
  16. ++left;
  17. --right;
  18. }
  19. }
  20. return true;
  21. }
  22. }

九、第35题:搜索插入位置,难度:简单

1、题目描述

/**
 * 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
 * <p>
 * 请必须使用时间复杂度为 O(log n) 的算法。
 * <p>
 * 示例 1:
 * <p>
 * 输入: nums = [1,3,5,6], target = 5
 * 输出: 2
 * 示例2:
 * <p>
 * 输入: nums = [1,3,5,6], target = 2
 * 输出: 1
 * <p>
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/search-insert-position
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 * @param nums
 * @param target
 * @return
 */

2、个人解法

暴力解法

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:40.8 MB, 在所有 Java 提交中击败了85.08%的用户

  1. public int searchInsert(int[] nums, int target) {
  2. int len = nums.length;
  3. for (int i = 0; i < len; i++) {
  4. if (nums[i] >= target) {
  5. return i;
  6. }
  7. if (i == len - 1) {
  8. return len;
  9. }
  10. }
  11. return 0;
  12. }

3、官方解法

二分搜索

  1. public int searchInsert(int[] nums, int target) {
  2. int left = 0, right = nums.length - 1;
  3. while (left <= right) {
  4. int mid = (left + right) / 2;
  5. if (nums[mid] == target) {
  6. return mid;
  7. } else if (nums[mid] < target) {
  8. left = mid + 1;
  9. } else {
  10. right = mid - 1;
  11. }
  12. }
  13. return left;
  14. }

十、第374题:猜数字大小

1、题目描述

/**
 * 猜数字游戏的规则如下:
 *
 * 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
 * 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
 * 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
 *
 * -1:我选出的数字比你猜的数字小 pick < num
 * 1:我选出的数字比你猜的数字大 pick > num
 * 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
 * 返回我选出的数字。
 *
 * 示例 1:
 *
 * 输入:n = 10, pick = 6
 * 输出:6
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/guess-number-higher-or-lower
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

2、个人解法

二分查找

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:38.2 MB, 在所有 Java 提交中击败了55.51%的用户

  1. public int guessNumber(int n) {
  2. int low=1,high=n;
  3. while (low<=high){
  4. // try{ Thread.currentThread().sleep(1000);//毫
  5. // }catch(Exception e){}
  6. int mid=(high-low)/2+low;
  7. int guess = guess(mid);
  8. if (guess==1){
  9. System.out.println("猜的数是:"+mid+",返回了:"+guess+",代表小了");
  10. low=mid+1;
  11. } else if (guess == -1) {
  12. System.out.println("猜的数是:"+mid+",返回了:"+guess+",代表大了");
  13. high=mid-1;
  14. }else {
  15. System.out.println("猜的数是:"+mid+",返回了:"+guess+",猜对了");
  16. return mid;
  17. }
  18. }
  19. return -1;
  20. }
  21. public int guess(int num){
  22. int target=6;
  23. return Integer.compare(target, num);
  24. }

3、官方解法

  1. public int guessNumber(int n) {
  2. int left = 1, right = n;
  3. while (left < right) { // 循环直至区间左右端点相同
  4. int mid = left + (right - left) / 2; // 防止计算时溢出
  5. if (guess(mid) <= 0) {
  6. right = mid; // 答案在区间 [left, mid] 中
  7. } else {
  8. left = mid + 1; // 答案在区间 [mid+1, right] 中
  9. }
  10. }
  11. // 此时有 left == right,区间缩为一个点,即为答案
  12. return left;
  13. }
  14. public int guess(int num){
  15. int target=6;
  16. return Integer.compare(target, num);
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1017544
推荐阅读
相关标签
  

闽ICP备14008679号