1. 程式人生 > >搜狗2019校園招聘筆試-智慧影象識別影象研究員

搜狗2019校園招聘筆試-智慧影象識別影象研究員

 

# -*- 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");
}