Android 菜鸡的进阶->leetcode 1.

 

/**
* Given nums = [2, 7, 11, 15], target = 9,
*
* Because nums[0] + nums[1] = 2 + 7 = 9,
* return [0, 1].
*
* 散装翻译:
* 题目描述:  给一个数字的数组 里边有N个 其中俩个加起来是  9 返回这俩个数的坐标
* 只要一个答案
*/


Method 1.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * Given nums = [2, 7, 11, 15], target = 9,
         *
         * Because nums[0] + nums[1] = 2 + 7 = 9,
         * return [0, 1].
         *
         * 散装翻译:
         * 题目描述:  给一个数字的数组 里边有N个 其中俩个加起来是  9 返回这俩个数的坐标
         * 只要一个答案
         */

//        我自己也想不出来 想出来也Low  爆了 发现有大佬给了答案  欣喜若狂

        int[] arr={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,38,
                    39,40};
        long l = System.currentTimeMillis();
        int[] ints = twoSum(arr, 79);
        long l1 = System.currentTimeMillis();
        System.out.println("答案:"+arr[ints[0]]+"    "+arr[ints[1]]   +"用时(毫秒): "+(l1-l));

    }

    /**
     * 这个方法我也会 low
     *    比如 此处有个party 然后 主办方 要找一堆跳舞能跳满分的 搭档
     *      这里有四个人 A  B  C  D
     *        AB 跳一次   AC  AD
     *        BC  BD
     *        CD
     *        然后看他们哪次跳满分了 就挑哪一对 后边不用跳了
     *
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSum(int[] nums, int target) {

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    return new int[]{i, j};
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }


   
}


Method2.

 

 /**
     * 因为这里是 基于Java
     *   Android 可以用SparseArray 代替 HashMap
     *
     *  这个方法 可能大概是:
     *      先把数组里边的数据  通过键值对 存到 hashmap里边
     *      这里  键 :下标对应的值  值:下标
     *      感觉反着存了  不知道为什么 存在即合理啊 ...有知道的求告知
     *      然后他遍历了数组
     *      假设当前i是要找的
     *      target (和) 减去 其中一个数 这里只需要找另外一个数就可以了
     *      用 hashmap 的 api containskey 如果 包含 (值=另外一个数)  的这个键 
     *      并且  map.get(complement)得到的键 不是i(假设的那个)   我觉得第二个判断防止
     *      举例: 和90  里边有个45  那么45+45  那不就尴尬了么
     *      这样 也可以 i肯定是第一个数   第二个数 map.get(complement)
     *      额...值正好是 存的 下标  这里有点明白 但是  map.containsValue()  也行吧 
     *      反正这方法牛批
     *
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSum2(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement) && map.get(complement) != i) {
                return new int[] { i, map.get(complement) };
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }

 

 


Method3.

/**
     * 感觉这个  是第二种 简化了 但是他第一轮肯定得不到结果
     *   而且这个耗时比上面 要多一点 虽然都是毫秒
     *   这里把  map.put(nums[i], i); 放在下面是防止 16-8=8 这种的
     *   同样的思路不过只用了一个循环
     *   这次有点 勇往直前的感觉 就是 假设nums[i] 是 要找的其中一个数  complement 是另一个数
     *   map.put(nums[i], i);  i是下标  nums[i]则是另一个对的数
     *   map.get(complement) 可以拿到一个对的下标
     *
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSum3(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }

 



java << >> >>>

  int a=2468;
        int b=-2468;
        int i = a << 1;
        int ii = a << 2;
        int i1 = a >> 1;
        int i11 = a >> 2;
        int i2 = a >>> 1;
        int i22 = a >>> 2;
        int b1 = b >>> 1;
        int b2 = b >>> 2;
        System.out.println(" a : "+a);
        System.out.println(" a << 1 ="+i);
        System.out.println(" a << 2 ="+ii);
        System.out.println(" a >> 1 ="+i1);
        System.out.println(" a >> 2 ="+i11);
        System.out.println(" a >>> 1 ="+i2);
        System.out.println(" a >>> 2 ="+i22);
        System.out.println(" b : "+b);
        System.out.println(" b >>> 1 ="+b1);
        System.out.println(" b >>> 2 ="+b2);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值