leetcode 1

100 阅读3分钟

1

给一个数组,数组中两数之和等于给定的target值,取出这两个数的位置; 如 nums= [2,7,11,15], target = 9; nums[0] + nums[1] = 9; return[0,1];

public class item1 {
	public static void main(String[] arg) {
		int[] p = {1,7,2,3,5};
		int[] arr = twoSum2(p, 5);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
	}
        // 方法一
	public static int[] twoSum1(int[] nums, int target) {
		if(nums == null || nums.length <2) {
			return new int[]{-1,-1};
		}
		int[] res = new int[] {-1, -1};
		for(int i =0; i<nums.length - 1; i++) {
			for(int j = i+1; j< nums.length; j++) {
				int item = nums[i] + nums[j];
				if(item == target) {
					res[0] = nums[i];
					res[1] = nums[j];
					break;
				}
			}
		}
		return res;
	}
	// 方法二
	public static int[] twoSum2(int[] nums, int target) {
		if(nums == null || nums.length <2) {
			return new int[]{-1,-1};
		}
		int[] res = new int[] {-1,-1};
		HashMap<Integer, Integer> map = new HashMap<>();
		for(int i=0;i<nums.length;i++) {
			if(map.containsKey(target -nums[i])) {
				res[0] = map.get(target - nums[i]);
				res[1] = i;
				break;
			}
			map.put(nums[i], i);
		}
		return res;
	}
}

2

给两个链表(3 -> 5-> 6) 和 (4->6 ->2)两表对应的值相加得到结果为(7->1->8),相加满足 满10进1;

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode p1 = l1;
		ListNode p2 = l2;
		ListNode cur = new ListNode(0);
		int sum = 0;
		ListNode p3 = cur;
		while(p1!=null||p2!=null) {
			if(p1!=null) {
				sum += p1.val;
				p1=p1.next;
			}
			if(p2!=null) {
				sum+=p2.val;
				p2=p2.next;
			}
			p3.next = new ListNode(sum%10);
			sum/=10;
			p3 = p3.next;
		}
		
		if(sum >0) {
			p3.next = new ListNode(sum);
		}
		return cur.next;
	}
public static void main(String argp[]) {
		ListNode li= new ListNode(1);
		li.next = new ListNode(2);
		ListNode l1 = new ListNode(5);
		l1.next = new ListNode(4);
		l1.next.next = new ListNode(6);
		l1.next.next.next = new ListNode(3);
		
		ListNode l2 = new ListNode(8);
		l2.next = new ListNode(3);
		l2.next.next = new ListNode(1);
		l2.next.next.next = new ListNode(6);
		ListNode result = addTwoNumbers(l1, l2);
		ListNode op = result;
		while(op !=null) {
			System.out.println(op.val);
			op = op.next;
		}
	}
/*
3
8
7
9
*/

3

一个stirng 取出string中 最长的 不重复的一段 如abcabcbb -> abc bbb -> b pwwkew ->wke

public static String NoRepeat(String li) {
		String[] arr = li.split("");
		Set set = new HashSet(arr.length);
		String rs = "";
		
		for(int i=0; i< arr.length; i++) {
			String list = Select(arr, arr[i], i);
			set.add(list);
		}
		
		for (Object object : set) {
			rs = rs.length() < ((String) object).length() ? (String) object : rs;
		}
		return rs;
	}
	public static String Select(String[] arr, String a, int j) {
		String rs = a;
		for(int i=j+1; i<arr.length; i++) {
			if(!arr[i].equals(a) && !rs.contains(arr[i])) {
				rs += arr[i];
			} else {
				return rs;
			}
		}
		return rs;
	}
public static void main(String argp[])  {
    String a="pwwkewsdfghqw";
    String data = NoRepeat(a);
    System.out.println(data);
}

4 在一个数组中找到三个数之和为0,

如 [-4, -3, 0, 2, 3, -1, 1,]找到三个和为0的三个数

一般有三种方法:

  • 循环三次,时间复杂度为o(n^3)
  • 循环两次,把数组用set装起来,在再set里面找到 -(a+b) 的值就行了,时间复杂度为o(n^2),空间复杂度为o(n)需要用到set
  • 先把数组sort从小到大排序,剩余的数用看成一组,比如数组sort后为[-4,-3,-1,0,1,2,3],先循环第一个数为-4,然后[-3,-1,0,1,2,3]看成一组,取出最两边的两个数,b=-3,c=3,和4相加 如果a+b+c > 0,则c向左移动,如果a+b+c < 0则b向右移动,一次类推找到和为0的三个数,时间复杂度为o(n)
// 循环两次
	public static void test1(List<Integer> li) {
		Set<List> res = new HashSet<>();
		for(int i = 0; i<li.size(); i++) {
			int a = li.get(i);
			for(int j = i+1; j<li.size(); j++) {
				List rs = new ArrayList();
				int b = li.get(j);
				int num = -(a+b);
				if(li.contains(num) && num !=a && num !=b) {
					int c = num;
					rs.add(a);
					rs.add(b);
					rs.add(c);
					Collections.sort(rs);  // 排序去重
					res.add(rs);
					continue;
				}
			}
		}
	
    // 打印
    for (List rs : res) {
    	String a = "";
    	for(int i =0; i<rs.size();i++) {
    		a += "    r"+i +":" + rs.get(i);
    	}
    	System.err.println(a);
    }
	/*
	r0:-4    r1:1    r2:3
    r0:-3    r1:1    r2:2
    r0:-3    r1:0    r2:3
    r0:-1    r1:0    r2:1
    */
}


// 循环一次
	public static void test2() {
		int[] arr = new int[]{-4, -3, 0, 2, 3, -1,  1};
		List<Integer> li = new ArrayList<Integer>();
		for (int i = 0; i < arr.length; i++) {
			li.add(arr[i]);
		}
		Collections.sort(li);
		Set<List> res = new HashSet<>();
		for (int i = 0; i < li.size(); i++) {
			int a = li.get(i);
			int l=i+1, r=li.size() - 1;
			while(l<r) {
				List rs = new ArrayList();
				int s = li.get(i) + li.get(l) + li.get(r);
				if(s > 0) {
					r =r- 1;
				} else if(s<0) {
					l=l+1;
				} else {
					rs.add(li.get(i));
					rs.add(li.get(l));
					rs.add(li.get(r));
					Collections.sort(rs);  // 排序去重
					res.add(rs);
					while(l<r && li.get(l) == li.get(l+1)) {
						l+=1;
					}
					while(l<r && li.get(r) == li.get(r-1)) {
						r-=1;
					}
					l+=1;
					r-=1;
				}
			}
		}
		// 打印
		for (List rs : res) {
			String a = "";
			for(int i =0; i<rs.size();i++) {
				a += "    r"+i +":" + rs.get(i);
			}
			System.out.println(a);
		}
	};