算法题(十八):搜狗19年校招编程题(一)——找区间

注:笔试时并没有AC,线下修改后可以输出示例结果。

问题:从一个序列中找出所有包含全部数字的最小索引区间,若有多个则按出现的顺序输出。

输入输出示例:

输入:1 1 3 4 6 6 5 1 1 3 3

输出:[2,7] [3,8] [4,9]

分析:先用一个list1来记录数组所有不重复的数字,再以0作为区间开始点,遍历数组(双重for循环),用一个list2来记录遍历过程中所有不重复的数字,遍历过程中判断list2的大小是否与list1相同,若相同则停止该轮遍历,并将停留点作为区间结束点。一趟结束后,再以该区间的开始点的下一个点作为新开始点进行遍历,重复直到新起点超过数组界限。需要注意的是在刚开始遍历时,可能出现类似“1,1,1”这样连续相同数字,为了求最小区间,应该把区间的开始点设为最后一个“1”的索引。

代码:

import java.util.ArrayList;
import java.util.Stack;
public class Main{
    
    public static void main(String[] args){

            int N = 10;
            int[] num ={1,1,2,2,3,2,1,3,2,1};
            //记录num中不重复的数
            ArrayList list = new ArrayList();
            for(int i=0; i list2 = new ArrayList();
            //记录每趟遍历的起点,用于应付“1,1,1”这样的情况
            Stack stack = new Stack();
            //记录每趟的起点
            Stack startStack = new Stack();
            //记录每趟的终点
            Stack endStack = new Stack();
            //为了按顺序输出,而准备,栈的逆序
            Stack startStack2 = new Stack();
            //为了按顺序输出,而准备,栈的逆序
            Stack endStack2 = new Stack();
            int start = -1;
            int end = -1;
            //第一趟从0开始,之后从start+1开始遍历
            for(int i=0; i

输出:[2,5] [4,7] [5,7] [6,8] [7,9] [8,10]

 

 

 

你可能感兴趣的:(算法,编程练手)