1. 程式人生 > >微信支付一面筆試題

微信支付一面筆試題

一個公司有很多員工,也有主管,每天員工和主管都需要簽到,但主管可以用簽到機確認有多少人上班,也可以按員工ID順序或簽到順序打印出上班的員工,還可以找出倒數第n個上班的員工是誰。
 要求:
     請用OO的方法分析和實現

     所有操作的時間消耗和空間消耗越低越好,其中排序演算法時間複雜度不能超過O(nlogn),極端情況下也不可以退化為n^2

#include <iostream>
#include <vector>
#include <time.h>
#include <algorithm>
#include <windows.h>
using namespace std;

struct Sign    //簽到ID和時間
{
	int ID;
	time_t time;
	Sign()
	{
		ID = 0;
		time = 0;
	}
};

bool compareByID(const Sign& a, const Sign& b)
{
	return a.ID < b.ID;
}
bool compareByTime(const Sign& a, const Sign& b)
{
	return a.time < b.time;
}

class Machine
{
private:
	vector<Sign> signs;
public:
	Machine()
	{
		vector<Sign> signs(0);
	}

	void clear()
	{
		vector<Sign>(0).swap(signs);
	}

	int count() const
	{
		return signs.size();
	}

	void sign(const int& ID, const time_t& time)    //簽到
	{
		Sign sign;
		sign.ID = ID;
		sign.time = time;
		signs.push_back(move(sign));
	}

	int partition(vector<Sign>& signs, int l, int r) {
		if (l >= r)
			return l;
		int i = l;
		int j = r;
		Sign k = signs[i];
		while (i < j) {
			while (i < j && signs[j].time >= k.time)
				--j;
			signs[i] = signs[j];
			while (i < j && signs[i].time <= k.time)
				++i;
			signs[j] = signs[i];
		}
		signs[i] = k;
		return i;
	}

	int findNthToTail(const int n)     //查詢倒數第n個打卡的
	{
		int k = signs.size() - n + 1;
		int l = 0, r = signs.size() - 1;
		int index = partition(signs, l, r);
		while (index != k - 1) {
			if (index < k - 1) {
				l = index + 1;
				index = partition(signs, l, r);
			}
			else if (index > k - 1) {
				r = index - 1;
				index = partition(signs, l, r);
			}
		}

		return signs[index].ID;
	}

	void maxHeapDown(vector<Sign>& signs, int i, int n, bool(*func)(const Sign&, const Sign&))
	{
		int j = 2 * i + 1;
		Sign temp = signs[i];
		while (j < n){
			if (j + 1 < n && func(signs[j], signs[j+1]))
				++j;
			if (func(signs[j], temp))
				break;
			else{
				signs[i] = signs[j];
				i = j;
				j = 2 * i + 1;
			}
		}
		signs[i] = temp;
	}

	void heapSort(vector<Sign>& signs, bool(*func)(const Sign&, const Sign&))    //堆排
	{
		for (int i = signs.size() / 2 - 1; i >= 0; i--)
			maxHeapDown(signs, i, signs.size(), func);
		for (int i = signs.size() - 1; i >= 1; i--){
			swap(signs[i], signs[0]);
			maxHeapDown(signs, 0, i, func);
		}
	}

	void print(bool (*func)(const Sign&, const Sign&))  //根據傳入的排序方式排序
	{
		//sort(signs.begin(), signs.end(), func);
		heapSort(signs, func);
		for (int i = 0; i < signs.size(); ++i)
		{
			cout << signs[i].ID << " ";
		}
		cout << endl;
	}
};

class Employee
{
private:
	int ID;
public:
	Employee(int ID)
	{
		this->ID = ID;
	}
	virtual void sign(Machine& machine)  //簽到
	{
		time_t t = time(NULL);
		machine.sign(ID, t);
	}
};

class Stuff : public Employee           //員工
{
public:
	Stuff(int ID) : Employee(ID)
	{

	}
};

class Manager : public Employee         //主管
{
public:
	Manager(int ID) : Employee(ID)
	{

	}
	int count(Machine& machine) const   //統計打卡數量
	{
		return machine.count();
	}
	void newDay(Machine& machine)       //新的一天
	{
		machine.clear();
	}
	void printByID(Machine& machine)     //根據ID順序列印打卡員工的ID
	{
		machine.print(compareByID);
	}
	void printByTime(Machine& machine)   //根據打卡順序列印打卡員工的ID
	{
		machine.print(compareByTime);
	}
	int findNthToTail(Machine& machine, int n)    //查詢倒數第n個打卡的人的id
	{
		return machine.findNthToTail(n);
	}
};

int main()
{
	Machine machine;
	Stuff* stuff1 = new Stuff(1);
	Stuff* stuff2 = new Stuff(2);
	Stuff* stuff3 = new Stuff(3);
	Stuff* stuff4 = new Stuff(4);
	Stuff* stuff5 = new Stuff(5);
	Stuff* stuff6 = new Stuff(6);
	Stuff* stuff7 = new Stuff(7);

	Manager* manager1 = new Manager(4);

	cout << manager1->count(machine) << endl;

	stuff1->sign(machine);
	Sleep(1000);
	stuff3->sign(machine);
	Sleep(1000);
	stuff2->sign(machine);
	Sleep(1000);
	stuff5->sign(machine);
	Sleep(1000);
	stuff7->sign(machine);
	Sleep(1000);
	stuff6->sign(machine);
	Sleep(1000);

	manager1->printByID(machine);
	manager1->printByTime(machine);
	cout << manager1->findNthToTail(machine, 3);


	return 0;
}


相關推薦

支付一面試題

一個公司有很多員工,也有主管,每天員工和主管都需要簽到,但主管可以用簽到機確認有多少人上班,也可以按員工ID順序或簽到順序打印出上班的員工,還可以找出倒數第n個上班的員工是誰。  要求:      請用OO的方法分析和實現     所有操作的時間消耗和空間消耗越低越好,其中

支付提示:同一交易不能多次提交

微信支付API上說明: OUT_TRADE_NO_USED 商戶訂單號重複 同一筆交易不能多次提交 請核實商戶訂單號是否重複提交 測試的時候先用微信支付得到預支付id,取消當前支付,再次付款的時候就會提示:“訂單號重複” 網上搜了一下,大概共有三種解決辦法: 1

H5調起支付功能

需要 con 返回 alert list 訂單 團隊 eve window 第一步:需要後端返回需要的以下參數: 該操作是你提交完訂單信息後在接口所返回的json, 其次將其存儲起來,我用的localStorage var payParams = {

支付開發填坑記之支付

wiki index 傳輸 系統 外網 ttr throw div union 微信支付,支持的支付方式比較多:有掃碼支付,刷卡支付,APP支付和公眾號支付。其中,APP和網站上最常用的就是APP支付和公眾號支付。前者集成在APP中,後者主要是為微信用戶提供了另一種支付方式

iOS支付demo運行報錯解決如下

art llb readme ring -objc override 項目 技術 cep 要接入微信支付的小夥伴,首先要下載一份官方demo(APP微信支付官方Demo下載),然後打開工程,準備大幹一場。 1、編譯報錯 編譯的時候居然直接報錯了(orz) 錯誤提示:

支付錯誤,頁面URL末註冊

net 控制器 index dex 微信 其中 大小寫 ssd 都是 最近在做個項目用到微信支付的JSSDK支付時候碰到“URL末註冊的問題”,可是我已經在公眾平臺裏的支付目錄裏添加了,測試了幾次都是這個問題,最後才發現原來是大小寫的問題,還有我的支

支付寶 采寶支付代理加盟可靠嗎?公司扶持給力輕松加盟

支付代理加盟 移動支付代理加盟 加盟服務商如今互聯網時代,人手一部手機,現金支付方式日漸冷落,取而代之的是手機刷碼支付,移動支付潮流全面興起, 采寶支付加盟可靠嗎?采寶支付在這種背景下全面“侵”入市場,很快獲得矚目,不管是消費者、商家,還是忙著創事業的投資者,都對這個品牌給予大大肯定。 采

采寶聚合支付服務商 +支付寶一站式服務平臺

聚合支付 二維碼支付 移動支付代理 支付寶支付代理服務商 杭州合言信息科技有限公司-發展至今,在支付中,支持各種支付工具,一站式支付服務商家(包括:支付寶、微信支付、中國銀聯)等支付服務,在各大第三方支付平臺僵持不下之際,采寶聚合支付便開始活躍在移動支付市場上。

支付代理加盟 支付寶掃碼支付申請條件

微信支付代理 微信支付加盟 支付寶支付掃碼申請我們先了解一下移動支付收單服務優勢吧? 加入采寶移動支付收單的優勢: 一、收單方式更為的快速,便捷,顧客只要在準備付錢時打開支付寶錢包或微信錢包給收銀員用掃描槍掃一下就完成交易了,不用找零,不用簽字,資金實時到賬,更杜絕了假幣風險。 二、政

支付-公眾號支付,統一下單,調起支付,回調驗證

.net log bsp 問題 常見問題 下單 article 微信 微信支付 參考:http://www.jianshu.com/p/a172a1b69fdd http://www.jianshu.com/p/1ae0ef652f63 http://www.jb51.n

支付寶下線商家收款 支付支付商家

支付寶下線商家收款 收款二維碼 支付寶下線商家收款 簡單來說,它可以用較簡單的方法,幫助中小商家們接入支付寶,快速掃碼,快速支付!與此前打印個人收款二維碼不同,官方收款碼將使商家轉變為簽約商戶,享受向銀行卡提取余額免手續費的優惠。 目前公司發展迅速,簽約商戶已超過10000家。 商

支付寶線下支付商家 開通支付寶商家簽約資料

二維碼支付代理 支付寶線下支付商家 付寶支付代理 微信支付寶商家簽約資料杭州合言信息科技有限公司-專註移動支付領域,二維碼支付代理,支付寶線下支付商家,支付寶支付代理,主要是服務於商戶,商戶和其一次對接之後,能同時支持微信支付,支付寶支付,百度錢包等多個支付渠道,包括支持多種第三方支付平臺、合作銀行及其他服務

支付支付創業好項目 采寶支付誠招合夥人

微信支付代理 支付寶支付代理商 支付寶省級代理 微信支付寶支付創業好項目?移動支付巨大的市場空間有無僅有的創富商機:移動支付在線下支付的春天即將到來”移動支付市場空間支付寶、微信希望用5年時間推動中國率先進入無現金社會。到2020年第三方移動支付市場的交易規模有望突破1000萬億元、如此巨大的支付市場,

支付寶二維碼支付代理加盟 采寶二維碼掃碼POS

微信支付代理 支付寶代理商 智能POS代理 現如今微信支付寶二維碼支付代理以及進入了支付潮流。如:銀幣、再到紙幣,演變到“錢”變得越來越輕薄。在現這個二維碼掃碼POS市場中,互聯網技術的支撐下,刷手機乘公交、刷支付寶買菜購物、繳水電費……日常生活中使用“現金”的場景,逐漸被手機各種支付方式取代,“無現金

支付代理市場潛力 越來越多的商家搶占市場

微信支付代理 支付寶支付加盟微信支付代理在未來還會不斷升級和優化,挖掘新的行業需求,開發出更多有潛力的經營項目,微信支付代理在解決支付方案經營難點的同時,也期待和越來越多的商戶和移動支付服務商家攜手共進,開拓市場,打造“共贏”局面。 微信支付,支付寶支付給我們帶來了什麽樣的改變?出門帶個手機吃喝

支付配置參數:支付授權目錄、回調支付URL

相關 分配 必須 申請 電腦 cas 主域名 最小 配置 一、開通微信支付的首要條件是:認證服務號或政府媒體類認證訂閱號(一般認證訂閱號無法申請微信支付) 二、微信支付分為老版支付和新版支付,除了較早期申請的用戶為老版支付,現均為新版微信支付。 三、公眾平臺微信支付開發配

c# 支付

close http 保存 article 平臺 c51 應用場景 字符 基本 ps:接著之前的完成了微信授權獲取用戶的基礎信息外 微信支付也需要快速完成,支付的確很多坑,大多數是不認真閱讀開發文檔導致 stemp1 :發起預支付api 此處遇到的坑是,由於需求中的信息

支付後臺獲取openid

except pos prot params tostring stat buffered boolean exc @RequestMapping(value = "/postOpenid", method = RequestMethod.POST) @ResponseBo

獲取支付所需簽名等

mode auto ppi rate one url con turn sub @RequestMapping(value = "/toPay", method = RequestMethod.POST) @ResponseBody public String getSho

快速接入PHP支付

其他 授權 true unifi 寫到 nbsp 多人 商品 attach 微信支付是微信開發中坑最多的一個功能,本文旨在幫助有開發基礎的人快速接入微信支付,如果要詳細了解微信支付,請看微信支付的開發文檔。 再說把開發文檔搬到這裏來就沒必要了。想要快速跑通微信支付的可以繼續