1. 程式人生 > >騰訊2017暑期實習生筆試題(有趣數字)

騰訊2017暑期實習生筆試題(有趣數字)

   之前準備把騰訊實習生招聘的第三道題做出來的,但是時間很緊,最終拖到今天才完成的,下午做了一個小時才弄出來的,主要是細節方面的問題。



這個題意思很簡單吧,給出很多數,找出“二元組”裡面差最小的和差最大的個數(兩個數的差事大的減去小的,也就是絕對值的意思)。說實話,這個題的處理確實很難把握。

    我的解題思路是:先將這個陣列排序,然後就很容易計算出差最大的二元組的個數,接下來就是計算最小二元組的個數。

  • 最大二元組的計算是分別計算出最大值和最小值(可能存在重複,需要把握住),假設最小值的個數為n,最大值的個數為m,那麼差最大的二元組的個數即為:n*m,若是不明白
  
  • 最小二元組的計算則相對複雜一些,但是排序以後,最小差距的計算就是計算相鄰兩個數的差。其中需要把握的東西就是計算過程中”差距“由一個值變為另一個值的時候需要好好把握,這個時候很容易出錯。我按照我寫的程式碼來講述,大家可以根據我所說的自己再設計程式碼,主要是一些細節的變化。還需要注意的一點就是,最小差並不一定是連續的,可能會間隔一些,我給個例子,大家對照著看看吧。

我寫的程式碼會剛開始的時候跳過對開始部分的兩個4的統計,最小值跟給出的值總是想差一點點,最後發現問題是出在兩次最小差改變的時候,下面給出程式碼,供參考一下。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void Solution(vector<int>& V){
	int sz = V.size();
	int min = 0;
	int minNum = 0;//最小二元組數目
	int maxNum = 0;//最大二元組數目
	if (sz == 0){
		cout << 0 << " " << 0 << endl; //差最小,差最大
		return;
	}
	else if (sz == 1){
		cout << 1 << " " << 1 << endl;
	}
	else{
		sort(V.begin(), V.end()); //排序

		int i = 0;
		int j = sz - 1;

		while (V[i] == V[i + 1] && i < sz - 1){
			++i;
		}
		while (V[j] == V[j - 1] && j > 0){
			--j;
		}
		maxNum = (i + 1)*(sz - j); //差最大的數

		min = V[sz - 1] - V[0] + 1;
		int flag = 0;
		for (int k = 0; k < sz - 1; ++k)
		{
			if (V[k + 1] - V[k] < min){
				min = V[k + 1] - V[k];
				minNum = 1;
				flag = 1; //主要用於記錄差距第一次變為0
				if (min == 0)
				{
					--k; //這樣做的目的是為了不錯過min=0的,第一次統計的時候會少統計一個
				}
			}
			else if (V[k + 1] - V[k] == min){
				int sum = 0;
				while (k< sz -1 && V[k + 1] - V[k] == min)
				{
					++k;
					++sum;
				}

				if (min == 0){	//差距為0				
					if (flag == 1){
						minNum = (sum)*(sum + 1) / 2; //差距一次變為0的時候需要好好注意
						flag = 0;
					}
					else{
						minNum += sum*(sum + 1) / 2;//根據相同元素個數計算二元組個數
					}
				}
				else{ //差距不為0
					minNum += sum;
					--k;  //k會加兩次(for迴圈也會加一次,所以需要調整一下)
				}
			}
		}
	}
	cout << minNum << " " << maxNum << endl;
}

int main()
{
	int n;
	int tmp;
	while (cin >> n){
		vector<int> arr;
		for (int i = 0; i< n; ++i){
			cin >> tmp;
			arr.push_back(tmp);
		}
		Solution(arr);
	}
	return 0;
}

相關推薦

2017暑期實習生試題(有趣數字)

   之前準備把騰訊實習生招聘的第三道題做出來的,但是時間很緊,最終拖到今天才完成的,下午做了一個小時才弄出來的,主要是細節方面的問題。 這個題意思很簡單吧,給出很多數,找出“二元組”裡面差最小的

2017暑期實習生試題解題答案彙總

構造迴文 題目 給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢? 輸出需要刪除的字元個數 輸入描述: 輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000.

2017暑期實習生程式設計題-有趣數字

傳送門 code #include<vector> #include<cstdio> #include<algorithm> #include<map>

2016年實習生試題-蛇形數組-循環枚舉遍歷

com alt 實習 png 枚舉 分享 .cn 循環 實習生 在n*n方陣裏填入1,2···,n*n,要求天成蛇形,如n=4時。 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5

2017暑期實習生編程題 第二題 字符移位

append () pen bic end OS gpo remove 描述 小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。 你能幫幫小Q嗎? 輸入描述: 輸入數據有多組,每組包含一個字符串s,且保證:

2017暑假實習試題-字串編碼

/* 騰訊2017暑假實習筆試題-字串編碼 輸入:16的倍數的字串 輸出:編碼後的結果 例子 輸入:abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl 輸出: 00000010 61 62 63 64 65

動態規劃——構造迴文——2017暑期實習生程式設計題

題目:給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢? 輸出需要刪除的字元個數。 輸入描述:輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000。 輸出描述:對於每組資料,輸出一個整數,

2017暑期實習生程式設計題 題解

1.構造迴文 給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢? 輸出需要刪除的字元個數。 解題思路分析:題意是說問我們最少刪幾個字元能夠使得這個字元變成一個迴文串,這裡需要用到迴文串的性質,因為迴文串是前後對稱的,所以我

2017秋招試題難點記錄

1.在vs編譯環境下,以下程式碼的執行情況: 1234567int f(int a, int b, int c){return 0;}int main(){return  f(printf("a"),printf("b"),printf("c"));}解析: 該題考

2017暑期實習生程式設計題

小Q最近遇到了一個難題:把一個字串的大寫字母放到字串的後面,各個字元的相對位置不變,且不能申請額外的空間。你能幫幫小Q嗎? 輸入描述: 輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000. 輸出描述: 對於每組資料,輸

2017校招暑期實習生試題1

構造迴文給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢? 輸出需要刪除的字元個數。輸入描述:輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000. 輸出描述:對於每組資料,輸出一個整數,

[2017校招線上試題]

import java.util.ArrayList; import java.util.Scanner; public class Main { public static ArrayList<Integer> rst = new ArrayL

經-2018暑期實習生-資料分析崗筆試經歷

發現今年雖然很多公司有了資料分析崗位面向本科生開放,但幾乎資料分析師的實習筆試幾乎都沒有考程式設計,注意是幾乎都沒有考!這也給了我們一些啟發,也說明現在的資料分析崗位職能方向更細化。 不定項選擇(每題4分共25題) 1.同事小鵝在訓練深度學習模型是發現訓

2017暑期實習筆試(LCS & 暴力 & 計數)

一共三道題,感覺第一題要想想,剩下兩道比較簡單,直接做就行了 Q1: 解題思路:對字串進行翻轉後,求一下最長公共子序列就是最長的迴文串,用總長度減去最長迴文串的長度即為要刪去的字元數 程式碼如下:

2018秋招試題之小Q的歌單

題目描述: 小Q有X首長度為A的不同的歌和Y首長度為B的不同的歌,現在小Q想用這些歌組成一個總長度正好為K的歌單,每首歌最多隻能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組

2017京東實習生試題(一)

下面程式的返回值是什麼? #include "stdafx.h" #include<iostream> using namespace std; int func(int x) {

2018暑期實習生招聘感受,崗位是後臺開發TEG事業群。

寫在前面:以前看過一個說法,你在面試大概進行到一半的時候基本就確定自己是否通過了,這裡我用實際例子給出反正,面試完還是收心等結果為好。我的面試官人特別好,是校友,還是本家。面試時間是2018年的4月15號下午上來第一步自我介紹,然後介紹簡歷裡面的專案,簡歷裡面寫了兩個專案,第

2017實習生春招面試記錄

面試官什麼也不問就問兩個問題,手動微笑 1、 假設a=99,b=99,用程式碼滿足以下基礎邏輯:   a + b = c   c - a = b  a、b、c 三個數,三個數值範圍均在:0<n&

2016校招試題(含答案)

騰訊2016校招筆試題(含答案) 1、父母生了兩個小孩。第一個是男孩,兩個都是男孩的概率是多少? 答案:1/2 解釋:第一個已經為男孩,第二個只有兩種可能男孩或女孩 概率=1乘二分之一 2、設k1,

2017暑假實習生招聘筆試程式設計題(1)

演算法基礎-字元移位 小Q最近遇到了一個難題:把一個字串的大寫字母放到字串的後面,各個字元的相對位置不變,且不能申請額外的空間。 你能幫幫小Q嗎? 輸入描述: 輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=10