我正在准备面试,在浏览候选人的经历时,我遇到了以下问题 -
给出一系列字符串:{“Sdjksajd”,“Skjdasjj”,“Bjsdakja”,“Xhudhau”,“Eeeeggg”,“Chrome”}。不使用库函数按字母顺序显示它们。
我不太擅长编码所以我尝试使用我的有限知识以下列方式做到这一点: -
#include<iostream>
#include<string>
using namespace std;
string selsort(string s);
string selsort(string s)
{
int i=0,j,k=0;
string min=&s[i];
for(i=0;i<6;i++)
{
for(j=i+1;j<6;j++)
{
if(s[j][k]<s[i][k])
{
string *temp;
min=s[j];
*temp=s[i];
s[i]=s[j];
s[j]=*temp;
}
else if(s[j][k]=s[i][k])
{
while(k<=s[j].length())
{
k++;
selsort(string s);
}
}
}
}
return s;
}
int main()
{
int i;
string s[6]={"Sdjksajd","Skjdasjj","Bjsdakja","Xhudhau","Eeeeggg","Chrome"};
s=selsort(s);
for(i=0;i<6;i++)
cout<<s[i];
return 0;
}
然而,我得到&#34;错误:无效类型&#39; char [int]&#39;对于数组下标&#34;我认为我的程序需要更多修改才能使其工作。我怎么能解决这个问题?
答案 0 :(得分:1)
虽然问题指明您不能使用库排序,但这并不意味着您不能通过库排序来启发。
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
另请注意RandomIt
的额外限制:它必须是ValueSwappable(并且取消引用可移动类型)。请注意,指向数组的指针是RandomIt
,字符串是Swappable
所以我们有两个部分:
目前,让我们假设我们有一个Compare
(我们稍后会定义一个)
现在,排序集合的一个明显属性是第一个元素小于其他每个元素。我们可以想象一个函数RandomIt min_element(RandomIt first, RandomIt last, Compare comp)
找到一个范围的最小元素。因此,我们可以将第一个元素与最小元素交换,然后继续使用该范围的其余部分。因此排序成为:
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp )
{
for (RandomIt it = first; it != last; ++it)
{
RandomIt min = min_element(it, last, comp);
swap(*it, *min);
}
}
现在我们需要实施min_element
。我们可以通过该范围,使用Compare
保持当前最小值。
template< class RandomIt, class Compare >
RandomIt min_element( RandomIt first, RandomIt last, Compare comp )
{
RandomIt min = first;
for (RandomIt it = first; it != last; ++it)
{
if (comp(*it, *min)) { min = it; }
}
return min;
}
我们还需要swap
template< typename T >
void swap(T & lhs, T & rhs)
{
T temp = static_cast<T&&>(lhs);
lhs = static_cast<T&&>(rhs);
rhs = static_cast<T&&>(temp);
}
现在我们有了排序功能,我们只需要能够按字母顺序比较std::string
。幸运的是,我们为<
定义了字符串来执行此操作,因此我们只需要:
bool string_less(const std::string & lhs, const std::string & rhs)
{
return lhs < rhs;
}
我们可以将这些全部放在一起
void string_sort(std::string * values, std::size_t count)
{
sort(values, values + count, string_less);
}