搜狗2019校园招聘笔试-智能图像识别图像研究员

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/grllery/article/details/82708244

# -*- coding: utf-8 -*-
"""
# @Time    : 2018/9/14 20:17
# @Author  : shen
# @FileName: sogou2018.py
"""

import sys

print("输入数据个数:")
in_num = int(sys.stdin.readline().strip('\n'))
line = []
for i in range(in_num):
    s1 = sys.stdin.readline().strip('\n')
    line.append(s1)

line_unique = list(set(line))  # 该数据序列中独特的数据,去重
line_unique_num = line_unique.__len__()

max_len = min(in_num, 10000)  # 最小区间长度的最大值


find_number = 0  # 查找到最小子串的个数
start_index = []  # 查找到最小子串的起始位置
# 循环可能的最小区间长度
for i in range(line_unique_num, max_len+1):
    min_length = i
    for j in range(0, in_num):
        sub_line = line[j: j + i]  # python有自动的溢出保护,不用边界判断
        sub_line_unique = list(set(sub_line))  # 子串数据去重

        # 子串数据去重后的长度 等于 整个数据序列去重的长度, 则找到最小区间长度
        if sub_line_unique.__len__() == line_unique_num:
            find_number += 1
            start_index.append(j+1)  # 因为数字序列的编号从1开始

    if find_number != 0:
        break

print(min_length, find_number)
for i in start_index:
    print('[%d,%d]' % (i, i + min_length - 1), end=' ')

"""
# 测试1
10
1
1
3
4
6
6
5
1
3
3

6 3
[2,7] [3,8] [4,9]
"""

"""
# 测试2
输入数据个数:
3
1
2
3

3 1
[1,3]
"""

C++

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<string>
#include<set>

using namespace std;

typedef int DT;

/********************************/
/*2018年9月15日15点56分	        */
/********************************/
int main()
{
	size_t num;
	cin >> num;
	vector<DT> seq(num, 0);
	for (size_t i = 0; i < num; i++)
	{
		cin >> seq[i];
	}
	set<DT> seq_unique(seq.begin(), seq.end());
	size_t seq_unique_size = seq_unique.size();

	
	size_t max_len = num > 10000 ? 10000 : num;  //最小区间长度的最大值
	int find_number = 0;			     //查找到最小子串的个数
	vector<DT> start_index;			     //查找到最小子串的起始位置
	int min_len = -1;
	for (size_t i = seq_unique_size; i <= max_len; i++)    //最小区间长度可能的值
	{
		min_len = i;
		for (size_t j = 0; j < num - i + 1; j++)  //注意边界判断
		{
			set<DT> sub_seq(seq.begin() + j, seq.begin() + j + i);
			size_t sub_seq_size = sub_seq.size();
			if (sub_seq_size == seq_unique_size)
			{
				find_number++;
				start_index.push_back(j + 1);
			}
		}
		if (find_number != 0)
		{
			break;
		}
	}
	printf("%d %d\n", min_len, find_number);
	for (size_t i = 0; i < start_index.size(); i++)
	{
		printf("[%d,%d] ", start_index[i], start_index[i] + min_len - 1);
	}
	printf("\n");
}

猜你喜欢

转载自blog.csdn.net/grllery/article/details/82708244