1. 程式人生 > >說謊者悖論-C++ 會議中有一些人說謊,有一些人說真話,求最少說謊人數

說謊者悖論-C++ 會議中有一些人說謊,有一些人說真話,求最少說謊人數

今天去杭州市信雅達科技有限公司面試C++軟體工程師,第一輪上機測試題目為實現說謊者悖論,具體題目如下:

一共N個人在舉行會議,有一些人說謊,有一些人說真話,其中第i個人說:“我們中總供有j(j<=n)個人說謊”,現在請計算在這n個人最少有多少個人說謊,其中,n<=10;若無解,輸出-1;

樣例:

輸入:總人數

輸入:說的話

輸出:最少說謊人數

輸入:5

輸入:11110(表示第一個人說:“總共有1個人說謊”;第二個人說:“總共有1個人說謊”;。。。第五個人說:“總共有0個人說謊”)

輸出:1

輸入:5

輸入:11111

輸出:5

原題圖:



我當時是這麼寫的:

#include <string>
#include <iostream>
using namespace std;

bool getSpeakList(int *speakList, int listSize, string speakData);
int judgementLie(int *speakList, int listSize);

int main()
{
    int userNumber = 0;
    string speakData;
	int *speakList = new int[userNumber];

	while (true) {
		cout << "Please enter the user number : ";
		cin >> userNumber;
		cout << "Please enter the speak data : ";
		cin >> speakData;
    
		if (!getSpeakList(speakList, userNumber, speakData)) {
			cout << "Error : error in getSpeakList." << endl;
			exit(0);
		}

		int result = judgementLie(speakList, userNumber);
		cout << "The lie person number is " << result << endl;
	}

    delete speakList;
    return 0;
}

bool getSpeakList(int *speakList, int listSize, string speakData)
{
    if (listSize != speakData.size() || listSize > 10) {
        return false;
    }

    for (int i = 0; i < listSize; ++i) {
        speakList[i] = speakData[i] - '0';
    }
    return true;
}

int judgementLie(int *speakList, int listSize)
{
    int *judgementList = new int[listSize];
    for (int i = 0; i < listSize; ++i) {
        judgementList[i] = 0;
    }
    for (int i = 0; i < listSize; ++i) {
        int sumLie = 0;
        int judgeTemp = (listSize - 1 - speakList[i]);
        for (int j = 0; j < listSize; ++j) {
            if (i == j) {
                continue;
            }
            if (speakList[i] == speakList[j]) {
                sumLie++;
            }
        }
        if (sumLie == judgeTemp) {
            judgementList[i] = 1;
        } else {
            judgementList[i] = -1;
        }
    }

    int result = 0;
    for (int i = 0; i < listSize; ++i) {
        if (judgementList[i] == -1) {
            result ++;
        }
    }
    if (result == 0) {
        result = -1;
    }

    delete judgementList;
    return result;
}


我的想法是這樣的:

既然最後要求說謊人的個數,那麼我們就判斷第i個人說謊了沒。

例如:

1號說共有1個人說謊,假設其沒說謊,那麼剩下的四個人裡面肯定有三個人說1,剩下的一個人說x(x!=1)

2號一樣

3號一樣

。。。

總結出來就是,計算(n-1-data[i])個人說data[i]

我不太清楚我的邏輯是否正確,如果有問題,請即時留言聯絡。