/**
* 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);