笔试题:给定一个排序数组和一个目标值,在数组中找到其目标值,并返回其索引。如果目标值不存在,则返回它按顺序插入的位置。
设计合适的数据结构
根据题目要求,在返回的下标中有两种属性:
- 结点存在,返回结点下标。
- 结点不存在,返回待插入的下标位置。
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;
}