面试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]);
	}
}

时间: 2024-11-05 14:47:12

面试10大算法题汇总-字符串和数组5的相关文章

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

11.String转int,即atoi函数实现. 主要考虑以下几种情况: 1.      String为空 2.      String中存在非数字字符,如空白字符,abcd等 3.      String的正负 Code: public class test { public static int atoi(String str) { if (str == null || str.length() < 1) return 0; str = str.trim(); char flag = '+'

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

14.实现strStr():搜索一个字符串在另一个字符串中的第一次出现的位置 例: #include <stdio.h> #include <string.h> int main () { char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple"); cout<<(*pch)<<endl; return 0; } 输出:s

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

题目链接: http://blog.csdn.net/xiaoranlr/article/details/43963933 1. 计算逆波兰式 题目要求如下: ["2","1", "+", "3", "*"] -> ((2 + 1) * 3)-> 9 ["4","13", "5", "/", "+"

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

3.分词 给定一个字符串s和一个单词字典,确定s是否可被字典分解为多个单词 如: 给定s="leetcode" dict=["leet","code"] 由于"leetcode"可被分割为"leet code",返回True 最简单的一种方法是遍历dict中的单词,查看其是否在s的起始位置,若在则继续查看s剩下部分,否则返回false import java.util.HashSet; import jav

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

20.寻找2D矩阵 给定一个从左到右从上到下递增的m*n矩阵,判断target是否在矩阵中 例: [ [1,  3,  5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] Target=3 返回:true 思路:二分查找 Code: public class test { public static boolean searchMatrix(int[][] matrix, int target) { if (matrix == null || matrix.l

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

17.最长连续序列 给定一个无序数组,求最长连续序列的长度.要求负责度为O(n) 例:数组num:[100, 4, 200,1, 3, 2]的最长连续序列为[1,2,3,4],长度为4 解法一:建立一个bool数组,用于表示该数字是否存在,之后求数组中连续为true的最长值即可.在[100, 4, 200, 1, 3, 2]中,其最小值为1,最大值为200,因此建立长度为iMax-iMin+1(200-1+1) = 200的数组bExist,之后对数组赋值,其中bExist[100 - 1] ,

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

6.匹配正则表达式 编写函数boolisMatch(String s, String p),完成正则表达式中"."和"*"的功能.例: isMatch("aa","a")return false isMatch("aa","aa")return true isMatch("aaa","aa")return false isMatch("a

编程面试的10大算法概念汇总

以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: 1. 字符串2. 链表3. 树4. 图5. 排序6. 递归 vs. 迭代7. 动态规划8. 位操作9. 概率问题10. 排列组合 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. toCharArray() // 获得字符串对应的char数组 Arrays.sort()

面试10大算法汇总

英文版 以下从Java角度解释面试常见的算法和数据结构:字符串,链表,树,图,排序,递归 vs. 迭代,动态规划,位操作,概率问题,排列组合,以及一些需要寻找规律的题目. 1. 字符串和数组 字符串和数组是最常见的面试题目类型,应当分配最大的时间.关于字符串,首先需要注意的是和C++不同,Java字符串不是char数组.没有IDE代码自动补全功能,应该记住下面的这些常用的方法. toCharArray() //获得字符串对应的char数组 Arrays.sort() //数组排序 Arrays.