题解:点名(暴力求解 + 哈希表 + 数学方法 + 位运算 + 二分算法),有需要借鉴即可。
1.题目
题目链接:LINK
这个题目有很多种解法。下面我不再细说,直接摆代码。
class Solution {
public:
//方法一:直接求解,暴力求解
// int takeAttendance(vector<int>& records)
// {
// for(size_t i = 0; i < records.size(); i++)
// {
// if(records[i] != i)return i;
// }
// return records.size();//最后一个数字缺失
// }
//方法二:哈希数组
// int takeAttendance(vector<int>& records)
// {
// int arr[10000] = {0};
// for(size_t i = 0; i < records.size(); i++)
// {
// arr[records[i]]++;
// }
// for(size_t i = 0; i < records.size(); i++)
// {
// if(arr[i] == 0) return i;
// }
// return records.size();
// }
//方法三:数学方法
// int takeAttendance(vector<int>& records)
// {
// int sum_i = 0;
// sum_i = (0 + records.size())*(records.size()+1) / 2;
// for(int i = 0; i < records.size(); i++)
// {
// sum_i -= records[i];
// }
// return sum_i;
// }
//方法四:位运算
// int takeAttendance(vector<int>& records)
// {
// int ret = 0;
// for(size_t i = 0; i < records.size() + 1; i++)
// {
// if(i != records.size())
// ret^=records[i];
// ret^=i;
// }
// return ret;
// }
//方法五:二分算法
int takeAttendance(vector<int>& records)
{
int left = 0, right = records.size() - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(records[mid] == mid) left = mid + 1;
else right = mid;
}
//特殊情况
return left == records[left] ? left + 1 : left;
//if(records[left] == left) return left+1;
//return left;
}
};
2.总结
这算个十分简单的题目,可以采用多种方法进行解答。
EOF