面试10大算法题汇总-字符串和数组5

7.合并重复区间

给定一组区间,合并其中重复的。例:

给定[1,3],[0,7],[2,6],[8,10],[15,18],其中[1,3]与[0,7]及[2,6]区间有重复,因此将其合并成一个区间:[0,7]。最终返回:

[0,7],[8,10],[15,18].


书上的解法用到了Comparator,其大致思路如下:

1.      创建一个间隔类Interval,其成员变量为start和end,分别表示间隔区间的开始和结束。

2.      创建一个Solution类,其包含merge方法,输入参数intervals及返回值result均为一个Interval类的List,用于表示输入&输出的间隔。merge方法用于合并重复区间:首先将输入的区间List按intervals按其中各interval的start大小从小到大排列。排序后的inatervals为:[0,7],[1,3],[2,6],[8,10],[15,18]。最后创建result,遍历intervals,若遍历过程中存在重复区间,则合并,否则将该interval加入result

3.      返回result

Code:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class test {
	public static class Interval {
		int start;
		int end;

		Interval() {
			start = 0;
			end = 0;
		}

		Interval(int s, int e) {
			start = s;
			end = e;
		}

		public String toString() {
			return "start:" + start + ",end:" + end + "\n";
		}
	}

	public static class Solution {
		public ArrayList<Interval> merge(ArrayList<Interval> intervals) {

			if (intervals == null || intervals.size() <= 1)
				return intervals;

			// sort intervals by using self-defined Comparator
			Collections.sort(intervals, new IntervalComparator());

			for (Interval t : intervals) {
				System.out.println(t);
			}
			ArrayList<Interval> result = new ArrayList<Interval>();

			Interval prev = intervals.get(0);
			for (int i = 1; i < intervals.size(); i++) {
				Interval curr = intervals.get(i);

				if (prev.end >= curr.start) {
					// merged case
					Interval merged = new Interval(prev.start, Math.max(
							prev.end, curr.end));
					prev = merged;
				} else {
					result.add(prev);
					prev = curr;
				}
			}

			result.add(prev);

			return result;
		}
	}

	public static class IntervalComparator implements Comparator<Interval> {
		public int compare(Interval i1, Interval i2) {
			return i1.start - i2.start;
		}
	}

	public static void main(String[] args) {
		Solution s = new Solution();
		ArrayList<Interval> intervals = new ArrayList<Interval>();
		intervals.add(new Interval(1, 3));
		intervals.add(new Interval(0, 7));
		intervals.add(new Interval(2, 6));
		intervals.add(new Interval(8, 10));
		intervals.add(new Interval(15, 18));

		ArrayList<Interval> temp = new ArrayList<Interval>();

		temp = s.merge(intervals);
		for (Interval t : temp) {
			System.out.println(t);
		}
	}
}

8.插入间隔

实例1:

原间隔List:[1,3],[6,9]

插入间隔:[2,5]

最终结果:由于[2,5]与[1,3]有重复,因此输出结果为[1,5],[6,9].

实例2:

原间隔List:[1,2],[3,5],[6,7],[8,10],[12,16]

插入间隔:[4,9]

最终结果:由于[4,9]与[3,5],[6,7],[8,10] 有重复,因此输出结果为[1,2],[3,10],[12,16]

 

这个和上一次差不多

Code:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class test {
	public static class Interval {
		int start;
		int end;

		Interval() {
			start = 0;
			end = 0;
		}

		Interval(int s, int e) {
			start = s;
			end = e;
		}

		public String toString() {
			return "start:" + start + ",end:" + end + "\n";
		}
	}

	public static class Solution {
		public ArrayList<Interval> insert(ArrayList<Interval> intervals,
				Interval newInterval) {

			ArrayList<Interval> result = new ArrayList<Interval>();

			for (Interval interval : intervals) {
				if (interval.end < newInterval.start) {
					result.add(interval);
				} else if (interval.start > newInterval.end) {
					result.add(newInterval);
					newInterval = interval;
				} else if (interval.end >= newInterval.start
						|| interval.start <= newInterval.end) {
					newInterval = new Interval(Math.min(interval.start,
							newInterval.start), Math.max(newInterval.end,
							interval.end));
				}
			}

			result.add(newInterval);

			return result;
		}
	}

	public static void main(String[] args) {
		Solution s = new Solution();
		ArrayList<Interval> intervals = new ArrayList<Interval>();
		intervals.add(new Interval(1, 3));
		intervals.add(new Interval(6, 9));

		ArrayList<Interval> temp = new ArrayList<Interval>();

		temp = s.insert(intervals, new Interval(2, 5));
		for (Interval t : temp) {
			System.out.println(t);
		}
	}
}

9.两数字之和

给定一个数组numbers及一个target,要求返回index1和index2,使得numbers[index-1]+numbers[index2-1]== target ,其中index1 <index2

例:

输入:数组numbers={2,7, 11, 15}, target=9

输出:index1=1,index2=2

解法一:

首先想到的最简单的方法就是穷举。

Code:

public class test {

	public static void getResult(int[] numbers, int target) {
		int len = numbers.length;
		int i = 0, j = 0;
		for (i = 0; i < len; ++i)
			for (j = i + 1; j < len; ++j)
				if (numbers[i] + numbers[j] == target) {
					++i;
					++j;
					String str = (i > j ? ("index1:" + j + ",index2:" + i)
							: ("index1:" + i + ",index2:" + j));
					System.out.println(str);
				}
	}

	public static void main(String[] args) {
		int[] numbers = { 2, 7, 11, 15 };
		getResult(numbers, 9);
	}
}

解法二:用HashMap。其中key的意思为还需加多少和才能为taget,value代表该值在数组中的位置。即numbers[value] + key ==target。这么说比较乱,继续看例子:

数组numbers={2,7, 11, 15}, target=9

解法:1.新建HashMap;2.遍历numbers;3.若map的key中有numbers的值,则表明找到了。

Code:

import java.util.HashMap;

public class test {

	public static class Solution {
		public static int[] twoSum(int[] numbers, int target) {
			HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
			int[] result = new int[2];

			for (int i = 0; i < numbers.length; i++) {
				if (map.containsKey(numbers[i])) {
					int index = map.get(numbers[i]);
					result[0] = index + 1;
					result[1] = i + 1;
					break;
				} else {
					map.put(target - numbers[i], i);
				}
			}

			return result;
		}
	}

	public static void main(String[] args) {
		int[] numbers = { 2, 7, 11, 15 };
		int[] result = Solution.twoSum(numbers, 9);
		System.out.println("index1:" + result[0] + ",index2:" + result[1]);
	}
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值