說謊者悖論-C++ 會議中有一些人說謊,有一些人說真話,求最少說謊人數
阿新 • • 發佈:2019-01-04
今天去杭州市信雅達科技有限公司面試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]
我不太清楚我的邏輯是否正確,如果有問題,請即時留言聯絡。