简单版
- 1. 两数求和
- 2. 回文数
- 3. 将整数倒转
- 4. 罗马转整数
1. 两数求和
我用的暴力求和。
package top.bitqian.easy.two_sum;import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;/*** 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。* <p>* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。* <p>* 你可以按任意顺序返回答案。** @author echo lovely* @date 2021/3/8 16:45*/public class DemoSum {/**输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。** */static int[] twoSum(int[] nums, int target) {int len = nums.length;for (int i = 0; i < len; i++) {int curVal = nums[i];// tips: 可以从 i + 1开始的for (int j = 0; j < len; j++) {boolean b = curVal + nums[j] == target && i != j;if (b) {return new int[]{i, j};}}}return new int[0];}public static int[] upgrade(int[] nums, int target) {Map<Integer, Integer> hashtable = new LinkedHashMap<>();for (int i = 0; i < nums.length; ++i) {if (hashtable.containsKey(target - nums[i])) {return new int[]{hashtable.get(target - nums[i]), i};}hashtable.put(nums[i], i);}return new int[0];}public static void main(String[] args) {int[] sum = twoSum(new int[]{2, 3, 10, 9, 7}, 19);System.out.println(Arrays.toString(sum));sum = twoSum(new int[]{3, 2, 4}, 6);System.out.println(Arrays.toString(sum));sum = upgrade(new int[]{2, 3, 10, 9, 7}, 12);System.out.println(Arrays.toString(sum));System.out.println("\n");sum = new int[]{1, 2, 3, 4};for (int i = 0; i < sum.length; ++i) {System.out.println(i);}}}
2. 回文数
针对于数字xxxx, 正序和反序都是一样的,称之为回文数。
使用数据结构栈解题,栈是先进后去,可以弹出来,得到相反的数,字符串比较就行了。
package top.bitqian.easy.palindrome;import java.util.Stack;/*** @author echo lovely* @date 2021/11/8 14:52* @description 回文数* https://leetcode-cn.com/problems/palindrome-number/*/public class Palindrome {public static void main(String[] args) {boolean b = isPalindrome(19091);System.out.println(b);System.out.println(upgrade(0));}// 使用栈解题public static boolean isPalindrome(int x) {if (x < 0) {return false;}String str = String.valueOf(x);Stack<String> stack = new Stack<>();for (String s : str.split("")) {stack.push(s);}String newStr = "";for (int i = stack.size() - 1; i >= 0; i--) {newStr = newStr.concat(stack.pop());}return newStr.equals(str);}/*** https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/*/public static boolean upgrade(int x) {// 特殊情况:// 如上所述,当 x < 0 时,x 不是回文数。// 同样地,如果数字的最后一位是 0,为了使该数字为回文,// 则其第一位数字也应该是 0// 只有 0 满足这一属性if (x < 0 || (x % 10 == 0 && x != 0)) {return false;}int revertedNumber = 0;while (x > revertedNumber) {revertedNumber = revertedNumber * 10 + x % 10;x /= 10;}// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。return x == revertedNumber || x == revertedNumber / 10;}}
3. 将整数倒转
注意整数有最大值和最小值!!!, 越界报错,用Long比较。
这里也是利用栈解决。
package top.bitqian.easy.reverse_integer;import java.util.Stack;/*** @author echo lovely* @date 2021/11/8 11:36* @description 两数反转* https://leetcode-cn.com/problems/reverse-integer/* 1. Integer.MIN_VALUE的绝对值不靠谱* 2. Integer.parseInt("9646324351") 转换过大数字, 可能出现异常*/public class ReverseInteger {public static void main(String[] args) {// the min value of integer, if you get a abs, it's will be a negative num..int val = -2147483648;int res = reverse(1534236469);System.out.println(res);// 结果是负数..System.out.println(-val);System.out.println(Math.abs((long) val));res = upgrade(val);System.out.println(res);}// 使用栈进行反转public static int reverse(int x) {if (x == 0)return x;if (x <= Integer.MIN_VALUE || x >= Integer.MAX_VALUE) {return 0;}String s = String.valueOf(Math.abs(x));Stack<String> stack = new Stack<>();for (String ele : s.split("")) {stack.push(ele);}s = "";for (int i = stack.size() - 1; i >= 0; i--) {s = s.concat(stack.pop());}// 关于证数转换问题, 如果数字超出整数范围, 会报转换错误异常。// Integer.valueOf("9646324351");// Exception in thread "main" java.lang.NumberFormatException: For input string: "9646324351"long tmp = Long.parseLong(s);boolean flag = tmp > Integer.MAX_VALUE || tmp < Integer.MIN_VALUE;if (flag) {return 0;}if (x > 0) {x = Integer.parseInt(s);return x;}x = Integer.parseInt(s);return -x;}/*** https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/*/public static int upgrade(int x) {int rev = 0;while (x != 0) {if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {return 0;}int digit = x % 10;x /= 10;rev = rev * 10 + digit;}return rev;}}
4. 罗马转整数
- 利用字典map存储,罗马和数字一一对应。
- 求出特殊的罗马数字组合,比如IV, 要用减法, IV是4
- 求加法的罗马数字,VI,就是6
package top.bitqian.easy.roman_to_integer;import java.util.HashMap;
import java.util.Map;/*** @author echo lovely* @date 2021/11/8 15:07* @description https://leetcode-cn.com/problems/roman-to-integer/*/public class RomanToInteger {public static void main(String[] args) {System.out.println(romanToInt("IV"));System.out.println(upgrade("XIV"));/*I 1V 5X 10L 50C 100D 500M 1000rules:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。*/}static Map<String, Integer> paramMap = new HashMap<>();static {paramMap.put("I", 1);paramMap.put("V", 5);paramMap.put("X", 10);paramMap.put("L", 50);paramMap.put("C", 100);paramMap.put("D", 500);paramMap.put("M", 1000);}public static int romanToInt(String s) {int res = 0;String[] specArr = new String[]{"IV", "IX", "XL", "XC", "CD", "CM"};// 1. 计算指定的字符for (String ele : specArr) {if (s.contains(ele)) {res += getVal(ele);s = s.replace(ele, "");}}// 2. 计算正常相加的字符for (String ele : s.split("")) {// IV, 防止s是""if ("".equals(ele))return res;Integer val = paramMap.get(ele);res += val;}return res;}private static int getVal(String ele) {int val = 0;String[] node = ele.split("");for (String tmp : node) {Integer i = paramMap.getOrDefault(tmp, 0);val = Math.abs(val - i);}return val;}/*https://leetcode-cn.com/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-by-leetcod-w55p/*/public static int upgrade(String s) {int ans = 0;int n = s.length();for (int i = 0; i < n; ++i) {int value = symbolValues.get(s.charAt(i));if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {ans -= value;} else {ans += value;}}return ans;}static Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {private static final long serialVersionUID = 4834716094584504863L;{put('I', 1);put('V', 5);put('X', 10);put('L', 50);put('C', 100);put('D', 500);put('M', 1000);}};}