我在面试时被问到了这个问题。我只是想知道答案是什么。我问他是否可以使用sizeof,他说“不行,字符串或数组的大小未知 - 您只需要到达中间部分。”
顺便说一下,我不确定是否实际上可以不遍历就解决这个问题。我几乎感觉他可能想看看我对答案有多自信:S不确定...
他的英语很糟糕 - 我也不确定这是否导致了误解。他直接告诉我,我不需要遍历列表就能到达中间:S:S我假设他的意思是根本不需要遍历.....:S
有两个计数器c1和c2。开始遍历列表,每次增加c1一次,每隔一次增加c2一次。当c1到达末尾时,c2将在中间位置。
你没有“遍历列表来查找长度”,然后将其除以二,你只是通过一次循环完成了这个过程。
我所能想到的另一种方法就是不断地取走列表的第一个和最后一个项目,直到只剩下中间的一个或几个项目。
您(或者面试官)在数据方面表述含糊不清,只提到了"string"和"array",这个问题可以是任何东西。
您提到字符串的长度未知,但从您的措辞中似乎是指不可知。
a) 如果只是未知,那么问题在于如何确定?对于字符串来说,例如,您可以将其结束字符设为'\0'
。然后可以应用其他答案所建议的一些算法。
b) 如果是不可知的,那么谜题就没有解答。没有开头和结尾的中间概念就没有意义。
总之,没有起点和终点,或长度,就不能谈论中间。这个问题要么故意无法回答,要么您没有理解它。您必须知道更多关于内存段的信息,而不仅仅是开头和类型。
int thearray[80];
int start = (int)&thearray;
int end = (int)(&thearray+1);
int half = ((end-start) / 4)/ 2;
std::cout << half << std::endl;
编辑:
这段代码假设你正在处理一个真正的数组,而不是指向其第一个元素的指针,因此像下面这样的代码:
int *pointer_to_first_element = (int *)malloc(someamount);
将无法工作,同样地,任何将数组引用降级为指向第一个元素的指针的表示法都不会起作用。基本上,任何使用 *
的表示法都不行。
thearray
是一个大小为4的实际对象数组,而不是指向其中一个元素的指针,那么这将起作用。 - Dennis Zickefoosethearray
初始化为thearray [80]
,得到结果为40。你是对的,关于指向第一个元素的指针,但这是唯一可用的方法,将遵守“无遍历”规则,并且sizeof(int)
可以是任意值,因为它只是一个硬编码数字。 - Serdalis&thearray
将是数组内存开始地址的引用,&thearray+1
将是该数组后面第一个地址的引用。我知道这是一个非常特殊的情况,但它确实存在,并且是唯一符合所有规则的情况。 - Serdalis我认为这个问题旨在测试您的问题分析和需求收集技能。正如其他人之前所说,我们需要至少另一条数据来解决这个问题。
我的方法是让面试官清楚地知道,我们可以通过函数调用中的一个约束条件来解决问题:调用者必须提供两个指针,一个指向数组的开头,另一个指向数组的结尾。给定这两个指针,并使用基本的指针算术,我得出了这个解决方案;请告诉我您对此的看法。
int *findMiddleArray( int const *first, int const *last )
{
if( first == NULL || last == NULL || first > last )
{
return NULL;
}
if( first == last )
{
return (int *)first;
}
size_t dataSize= ( size_t )( first + 1 ) - ( size_t )first,
addFirst= ( size_t )first,
addLast= ( size_t )last,
arrayLen= ( addLast - addFirst) / dataSize + 1,
arrayMiddle= arrayLen % 2 > 0 ? arrayLen / 2 + 1 : arrayLen / 2;
return ( int * )( ( arrayMiddle - 1 ) * dataSize + addFirst );
}
找到数组中点的一种方法是(对于奇数长度的数组),只需使用两个循环,第一个循环从0索引开始遍历,另一个嵌套的循环将从数组的最后一个索引开始遍历。现在只需比较元素,当它们相同时...那就是数组的中点。即如果(arr[i]== arr[j])。希望你明白了!
对于偶数长度的数组...你可以这样做if(arr[i] == arr[j-1]) 或者 if(arr[i] == arr[j+1]) 因为它们永远不会相同。通过干运行试试吧!
r
:) - Saeed Amiri