本文介绍: 给你一个整数 x ,如果 x 是一个回文整数返回 true;否则,返回 false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。解题思路:注意负数,10的情况。

回文数

给你一个整数 x ,如果 x 是一个回文整数返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数

示例 1输入:x = 121
输出true

示例 2输入:x = -121
输出false
解释:从左向右读,-121从右向左读,121- 。因此它不是一个回文数。

示例 3输入:x = 10
输出false
解释:从右向左读,01 。因此它不是一个回文数。

解题思路:注意负数,10的情况。

    public boolean isPalindrome(int x) {
        // 如果是10的倍数也不是回文
        if (x < 0 || (x % 10 == 0 &amp;&amp; x != 0)) {
            return false;
        }
        
        int revertedNumber = 0;
        while(x &gt; revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        return x == revertedNumber || x == revertedNumber / 10;

    }

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

示例 1:
在这里插入图片描述&gt; 输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组
[1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2: 输入:height = [1,1] 输出:1

解题思路: 首尾两个指针,每次移动后判断长宽的乘机是否最大。

   public int maxArea(int[] height) {
        if (height == null || height.length == 0) {
            return 0;
        }

        int cap = 0;
        int i = 0;
        int j = height.length - 1;
        while(i < j) {
            if (height[i] < height[j]) {
                cap = Math.max(cap, (j - i) * height[i++]);
            } else {
                cap = Math.max(cap, (j - i) * height[j--]);
            }
        }
   
        return cap;
    }

整数罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字

解题思路:按照罗马数字字符数值计算出对应罗马数字的十进制数即可

 	int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman(int num) {
        StringBuffer roman = new StringBuffer();
        for (int i = 0; i < values.length; ++i) {
            int value = values[i];
            String symbol = symbols[i];
            while (num >= value) {
                num -= value;
                roman.append(symbol);
            }
            if (num == 0) {
                break;
            }
        }
        return roman.toString();

    }

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1][-1,-1,2] 。
注意,输出顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出[[0,0,0]]
解释:唯一可能的三元组和为 0

解题思路:用map提前计算好两数之和,临时缓存起来,可以将复杂度降到O(N^2),比较麻烦的在于最后输出不重复的解,数组中同一个数字可能出现多次,但是最后解不能重复,所以需要去重和排序map记录每个数字出现的次数,然后key进行排序最后排序之后的数组里面去查找,找到另外两个数字能和自己组成0。

首先对数组进行排序排序后固定一个数 nums[i]nums[i]nums[i],再使用左右指针指向 nums[i]nums[i]nums[i]后面的两端,数字分别为 nums[L]nums[L]nums[L] 和 nums[R]nums[R]nums[R],计算三个数的和 sumsumsum 判断是否满足为 000,满足则添加结果集

如果 nums[i]nums[i]nums[i]大于 000,则三数之和必然无法等于 000,结束循环
如果 nums[i]nums[i]nums[i] == nums[i−1]nums[i-1]nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sumsumsum == 000 时,nums[L]nums[L]nums[L] == nums[L+1]nums[L+1]nums[L+1] 则会导致结果重复,应该跳过,L++L++L++sumsumsum == 000 时,nums[R]nums[R]nums[R] == nums[R−1]nums[R-1]nums[R−1] 则会导致结果重复,应该跳过,R−−R--R−−
时间复杂度:O(n2)O(n^2)O(n2 ),n 为数组长度

 public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList();

        int len = nums.length;
        // 小于3个数直接返回空
        if (nums == null || len < 3) {
            return ans;
        }

        // 排序
        Arrays.sort(nums);

        for(int i = 0; i < len; i++) {
            if(nums[i] > 0) {
                break;
            }
            if(i > 0 &amp;&amp; nums[i] == nums[i - 1]) {
                // 连续两数一样,去重
                continue;
            }
            int l = i + 1; // 从左边开始
            int r = len - 1; // 从右边开始
            while(l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == 0) {
                    ans.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    while(l < r &amp;&amp; nums[l] == nums[l + 1]) {
                        l++;
                    }
                    while(l < r &amp;&amp; nums[r] == nums[r - 1]) {
                        r--;
                    }
                    l++;
                    r--;
                } else if(sum < 0) {
                    l++;
                } else if(sum > 0) {
                    r--;
                }
            }
        }
        return ans;
    }

最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。

示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:
输入:nums = [0,0,0], target = 1
输出:0

解题思路:用两个指针方法,先对数组进行排序,i从头开始往后走。这里需要注意数组中存在多个重复数字的问题。j,k 两个指针一前一后相向移动。


  public int threeSumClosest(int[] nums, int target) {
        // 先排序
        Arrays.sort(nums);
        int ans = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.length; i++) {
            int start = i + 1;
            int end = nums.length - 1;
            while(start < end) {
                int sum = nums[start] + nums[end] + nums[i];
                if(Math.abs(target - sum) < Math.abs(target - ans)) {
                    ans = sum;
                }
                if(sum > target) {
                    end--;
                } else if(sum < target) {
                    start++;
                } else {
                    return ans;
                }
            }
        }
        return ans;
    }

原文地址:https://blog.csdn.net/javaJasonjava/article/details/134655000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_5385.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注