1.最大子序和

  1. /**
  2. * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
  3. * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
  4. * 输出:6
  5. * 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
  6. */
  7. public class Test_01 {
  8. public static void main(String[] args) {
  9. int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
  10. int res = mxaSubArray(nums);
  11. System.out.println(res);
  12. }
  13. /**
  14. * 解释:
  15. * 数组第一个数赋值给res
  16. * 定义一个常量sum=0存放临时
  17. * for循环
  18. */
  19. private static int mxaSubArray(int[] nums) {
  20. int res = nums[0];
  21. int sum = 0;
  22. for (int num : nums) {
  23. if (sum > 0)
  24. sum += num;
  25. else
  26. sum = num;
  27. res = Math.max(res, sum);
  28. }
  29. return res;
  30. }
  31. }

2.两数之和

  1. /**
  2. * 输入:nums = [2,7,11,15], target = 9
  3. * 输出:[0,1]
  4. * 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
  5. */
  6. public class Test {
  7. public static void main(String[] args) {
  8. int[] nums = {3,2,4};
  9. int target = 6;
  10. Solution solution = new Solution();
  11. int[] ints = solution.twoSum(nums, target);
  12. for (Integer i :ints) {
  13. System.out.println(i);
  14. }
  15. }
  16. }
  17. class Solution {
  18. public int[] twoSum(int[] nums, int target) {
  19. HashMap<Integer,Integer> map = new HashMap<>();
  20. for(int i = 0; i < nums.length; i++){
  21. if(map.containsKey(nums[i])){
  22. return new int[]{map.get(nums[i]), i};
  23. }
  24. map.put(target - nums[i], i);
  25. }
  26. return null;
  27. }
  28. }

3.最后一个单词的长度

  1. /**
  2. * 给你一个字符串 s,由若干单词组成,单词之间用空格隔开。
  3. * 返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0
  4. *
  5. * 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
  6. */
  7. public class Test_02 {
  8. public static void main(String[] args) {
  9. String s = "Today is a nice day";
  10. int res = lengthOfLastWord(s);
  11. System.out.println(res);
  12. }
  13. private static int lengthOfLastWord(String s) {
  14. String[] split = s.split(" ");
  15. if (split.length==0){
  16. return 0;
  17. }
  18. return split[split.length-1].length();
  19. }
  20. }

4.加一

  1. /**
  2. * 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
  3. * 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
  4. * 你可以假设除了整数 0 之外,这个整数不会以零开头。
  5. */
  6. public class Test_03 {
  7. public static void main(String[] args) {
  8. int[] array = {9,9,9};
  9. int[] res = plusOne(array);
  10. System.out.println(Arrays.toString(res));
  11. }
  12. private static int[] plusOne(int[] array) {
  13. for (int i = array.length-1; i >=0 ; i--) {
  14. if (array[i]!=9){
  15. array[i]++;
  16. return array;
  17. }
  18. array[i] = 0;
  19. }
  20. //跳出for循环,说明数字全为9
  21. int[] temp = new int[array.length+1];
  22. temp[0] = 1;
  23. return temp;
  24. }
  25. }

5.整数反转

  1. /**
  2. * 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
  3. * 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
  4. *
  5. * 假设环境不允许存储 64 位整数(有符号或无符号)。
  6. * 输入:x = 123
  7. * 输出:321
  8. * 输入:x = -123
  9. * 输出:-321
  10. * 输入:x = 120
  11. * 输出:21
  12. */
  13. public class Test_01 {
  14. public static void main(String[] args) {
  15. int x = 0;
  16. int y = reversee(x);
  17. System.out.println(y);
  18. }
  19. private static int reversee(int x) {
  20. String s = String.valueOf(x);
  21. int flag = 1;
  22. if (x<0){
  23. flag = -1;
  24. s = s.substring(1);
  25. }
  26. try{
  27. return Integer.parseInt(new StringBuffer(s).reverse().toString())*flag;
  28. }catch (Exception e){
  29. return 0;
  30. }
  31. }
  32. }

6.回文数

  1. /**
  2. * 回文数
  3. 输入:x = 121
  4. 输出:true
  5. 输入:x = 10
  6. 输出:false
  7. */
  8. private static boolean isPalindrome1(int x) {
  9. String str = String.valueOf(x);
  10. char[] chars = str.toCharArray();
  11. for (int i = 0; i < chars.length; i++) {
  12. if (chars[i] != chars[chars.length-1-i]){
  13. return false;
  14. }
  15. }
  16. return true;
  17. }

7.最长公共长缀

  1. /**
  2. * 编写一个函数来查找字符串数组中的最长公共前缀。
  3. * 如果不存在公共前缀,返回空字符串 ""。
  4. * 输入:strs = ["flower","flow","flight"]
  5. * 输出:"fl"
  6. * 输入:strs = ["dog","racecar","car"]
  7. * 输出:""
  8. * 思想:拿String 的 startWith方法判断是否以她为前缀
  9. */
  10. public static String longestCommonPrefix(String[] strs){
  11. if (strs.length == 0) return "";
  12. String flag = strs[0];
  13. for (String string:strs) {
  14. while (!string.startsWith(flag)){
  15. flag = flag.substring(0, flag.length()-1);
  16. }
  17. }
  18. return flag;
  19. }

8.爬楼梯

  1. /**
  2. * 1 2 3 4 5 6
  3. * 1 2 3 5 8 13
  4. *
  5. * 输入: 2
  6. * 输出: 2
  7. * 解释: 有两种方法可以爬到楼顶。
  8. * 1. 1 阶 + 1 阶
  9. * 2. 2 阶
  10. * 示例 2:
  11. *
  12. * 输入: 3
  13. * 输出: 3
  14. * 解释: 有三种方法可以爬到楼顶。
  15. * 1. 1 阶 + 1 阶 + 1 阶
  16. * 2. 1 阶 + 2 阶
  17. * 3. 2 阶 + 1 阶
  18. */
  19. private static int climbStairs(int i) {
  20. if (i<=2){
  21. return i;
  22. }
  23. int i1 = 1;
  24. int i2 = 2;
  25. for (int j = 3; j <= i; j++) {
  26. int temp = i1+i2;
  27. i1=i2;
  28. i2=temp;
  29. }
  30. return i2;
  31. }

9.1比特与2比特字符

  1. /**
  2. * 有两种特殊字符:
  3. *
  4. * 第一种字符可以用一个比特 0 来表示
  5. * 第二种字符可以用两个比特(10 或 11)来表示、
  6. * 给定一个以 0 结尾的二进制数组bits,如果最后一个字符必须是一位字符,则返回 true 。
  7. *
  8. * 示例:
  9. *
  10. * 输入: bits = [1, 0, 0]
  11. * 输出: true
  12. * 解释: 唯一的编码方式是一个两比特字符和一个一比特字符。
  13. * 所以最后一个字符是一比特字符。
  14. *
  15. * 输入: bits = [1, 1, 1, 0]
  16. * 输出: false
  17. * 解释: 唯一的编码方式是两比特字符和两比特字符。
  18. * 所以最后一个字符不是一比特字符。
  19. */
  20. /**
  21. * 思路:
  22. * 1、遇到0则+1
  23. * 2、遇到1则+2
  24. * 3、判断最后与数组长度是否相等
  25. */
  26. public static boolean isOneBitCharacter(int[] bits) {
  27. int start = 0;
  28. while (start<bits.length-1){
  29. if (bits[start] == 0){
  30. start++;
  31. }
  32. if (bits[start] == 1){
  33. start += 2;
  34. }
  35. }
  36. return start == bits.length-1;
  37. }