Qouson's blog Qouson's blog
首页
  • Java 基础

    • 基础
    • String
  • Java 中级

    • 网络编程
  • Java 高级

    • JVM
    • 多线程
  • Spring
  • SpringMVC
  • SpringBoot
  • MySQL
  • Redis
  • MQ
  • ZooKeeper
  • git
  • linux
  • 设计模式
  • 数据结构与算法
  • 计算机基础
  • Java相关框架
  • 分布式
  • DDD领域驱动设计
  • 系统设计
  • 杂乱无章
Java知识图谱
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

qouson

Java界的小学生
首页
  • Java 基础

    • 基础
    • String
  • Java 中级

    • 网络编程
  • Java 高级

    • JVM
    • 多线程
  • Spring
  • SpringMVC
  • SpringBoot
  • MySQL
  • Redis
  • MQ
  • ZooKeeper
  • git
  • linux
  • 设计模式
  • 数据结构与算法
  • 计算机基础
  • Java相关框架
  • 分布式
  • DDD领域驱动设计
  • 系统设计
  • 杂乱无章
Java知识图谱
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • git

  • linux

  • 设计模式

  • 数据结构与算法

    • algorithm
      • leetcode
        • twoSum
      • other
        • MTwoN
    • 常用技巧
    • 反转链表
  • 计算机基础

  • Java相关框架

  • 分布式

  • DDD领域驱动设计

  • 系统设计

  • DevOps

  • python

  • 杂乱无章

  • 更多
  • 数据结构与算法
qouson
2024-05-23
目录

algorithm

# Algorithm

# leetcode

# twoSum

  • Demo
/**
 * 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
 * 示例:
 * 给定aums=[2,7,11,15],target=9
 * 因为nums[0]+nums[1]=2+7=9
 * 所以返回[0,1]
 */
public class TwoSum {
    public static void main(String[] args) {
        int[] nums = new int[]{2,7,11,15};
        int target = 9;
        System.out.println(Arrays.toString(m1(nums, target)));
        System.out.println(Arrays.toString(m2(nums, target)));
    }
    public static int[] m1(int[] nums,int target){
        for(int i = 0; i < nums.length; i++){
            for(int j = i + 1; j < nums.length; j++){
                if(nums[i] + nums[j] == target){
                    return new int[]{i,j};
                }
            }
        }
        return null;
    }
    public static int[] m2(int[] nums,int target){
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            int partnerNumber = target - nums[i];
            if(map.containsKey(partnerNumber)){
                return new int[]{map.get(partnerNumber),i};
            }
            map.put(nums[i],i);
        }
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# other

# MTwoN

  • Demo
/**
 * 给定一个数m求大于该数的最小2的n次幂,返回n
 */
public class MTwoN {
    public static void main(String[] args) {
        System.out.println(mTwoN1(34));
        System.out.println(mTwoN2(34));
    }
    public static int mTwoN1(int m){
        int i = 1;
        int temp = 1;
        while(m >= (temp = temp * 2)){
            ++i;
        }
        return i;
    }
    //这个问题就是把最高位的1后面的都变为1,然后 + 1得到结果。
    //就好比细胞分裂,最高位1是一个不断分裂的细胞,第一次1变2,然后两个细胞一起分裂;
    // 2变4(右移两位);之后4个继续分裂为8(右移4位),这就是为什么不是每次右移1位。
    // (假设每次进行一次右移,那么相当于每次只有一个细胞在分裂)
    //https://my.oschina.net/u/3870422/blog/3213854
    public static int mTwoN2(int m){
        int n = m - 1;//因为n可能已经是2的幂。先减去1
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (int)(Math.log(n + 1) / Math.log(2));//因为要求出大于>=n的2的幂。加1正好可以求出。
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
编辑 (opens new window)
上次更新: 2024/05/24, 11:36:46
UML类图
常用技巧

← UML类图 常用技巧→

最近更新
01
杂乱无章
12-25
02
基础-大彬
11-14
03
集合-大彬
11-14
更多文章>
Theme by Vdoing | Copyright © 2023-2025 qouson
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式