筆試題:給定一個排序數組和一個目標值,在數組中找到其目標值,並返回其索引。如果目標值不存在,則返回它按順序插入的位置。
設計合適的數據結構
根據題目要求,在返回的下標中有兩種屬性:
- 結點存在,返回結點下標。
- 結點不存在,返回待插入的下標位置。
struct Result
{
int index; // 結點下標
bool falg; // 標記
};
如果 falg = true,則找到目標結點。
如果 falg = false, 則返回待插入位置。
遞歸:
struct Result
{
int index;
bool falg;
};
Result FindVal(int* ar, int left, int right, int val)
{
Result res = { -1,false };
int mid = (right - left) / 2 + left;
if (left <= right)
{
if (val < ar[mid])
{
res = FindVal(ar, left, mid - 1, val);
}
else if (ar[mid] < val)
{
res = FindVal(ar, mid + 1, right, val);
}
else
{
res.index = mid;
res.falg = true;
}
}
if (!res.falg && res.index == -1)
{
res.index = mid;
}
return res;
}
Result BinFindVal(int* ar, int n, int val)
{
Result res = { -1,false };
if (ar!= NULL && n > 1)
{
res = FindVal(ar, 0, n-1, val);
}
return res;
}
非遞歸:
Result NiceFindVal(int* ar, int n, int val)
{
Result res = { -1,false };
int low = 0, high = n;
while (low <= high)
{
int mid = (high - low) / 2 + low;
if (val < ar[mid])
{
high = mid - 1;
}
else if (ar[mid] < val)
{
low = mid + 1;
}
else
{
res.index = mid;
res.falg = true;
break;
}
}
return res;
}
Result NiceBinFindVal(int* ar, int n, int val)
{
Result res = { -1,false };
if (ar != NULL && n > 1)
{
res = FindVal(ar, 0, n - 1, val);
}
return res;
}
測試用列
int main()
{
int ar[] = { 12,23,34,45,56,67,78,89,90,100 };
int n = sizeof(ar) / sizeof(ar[0]);
int val;
while (cin >> val, val != -1)
{
Result res = BinFindVal(ar, n, val);
cout << res.falg << " " << res.index << "\t";
res = NiceBinFindVal(ar, n, val);
cout << res.falg << " " << res.index << endl;
}
return 0;
}