Problem 1: Set Callbacks
a)
int CompareEntry(entryT one, entryT two)
{
if(one.lastName < two.lastName)
return -1;
else if(one.lastName > two.lastName)
return 1;
else if(one.firstName < two.firstName)
return -1;
else if(one.firstName > two.firstName)
return 1;
else
return 0;
}
函数声明为:
Set<entryT> addresses(CompareEntry);
分析:这是一个set类的声明函数,set类为addresses, 功能是输入2个数据,比较,选择是否加入set中,然后返回set类的数据。
b)同样的问题,还是写setcallback函数
int CompareStringCaseInsensitive(string one, string two)
{
string lowerOne = ConvertToLowerCase(one);
string lowerTwo = ConvertToLowerCase(two);
if(lowerOne < lowerTwo)
return -1;
else if(lowerOne > lowerTwo)
return 1;
else
return 0;
}
函数声明:
Set<string> caseInsensitiveSet(CompareStringCaseInsensitive);
大同小异
Problem 2: Maps
map类的key是string型的,通过把用户定义的数据改写成string类解决该问题。
Map<string> nameMap;
for(int cityIndex = 0; cityIndex < cities.size();cityIndex++)
{
cityT currCity = cities[cityIndex];//从vector中取出的数据
string key = IntegerToString(currCity.coordinates.x) + "-" +
IntegerToString(currCity.coordinates.y);
nameMap.add(key, currCity.name);
}
Problem 3: Cartesian Products
Set<pairT> CartesianProduct(Set<string> & one, Set<string> & two){
Set<pairT> set(PairCmpFn);//PairCmpFn为比较函数
pairT temp;
Set<string>::Iterator oneIt = one.iterator();//定义one的迭代器
Set<string>::Iterator twoIt = two.iterator();//定义two的迭代器
while(oneIt.hasNext()){
temp.first = oneIt.next();
while(twoIt.hasNext()){
temp.second = twoTt.next();
set.add (temp);//将整合的set加入set中
}
}
return set;
}
Set<pairT> set(PairCmpFn);//PairCmpFn为比较函数
这一步,估计是Set类定义的,用于加入不同的类型时进行的比较操作,problem1中有比较部分的编写,至于整个函数在set类中中应该会有具体操作,学到后面应该会学到。
Problem 4: Cannonballs
递归算法初体验
基本格式:f(n){ if xxx return x; //最简单情况
else return f(n-1); //递归
}
int cannonballls(int n){
if (n == 0) return 0;
else return (n*n + cannonballls(n-1));
}
Problem 5: ReverseString
分别用递归和迭代实现字符串的转置。递归写的快(maybe hehe),但执行慢;迭代相反。
string ReverceStringRecursive (string str){
if (str.size() == 0) return 0;
else return (ReverceStringRecursive(str.substr(1)) + str[0] );
}
string ReverceStringIterative(string str){
string result ="";
for (int i = str.size()-1 ; i >=0 ; i--)
result += str[i];
return result;
}
Problem 6: GCD
这应该是求解最大公约数但最经典解法把
int GCD(int x, int y){
if ((x%y == 0)) return y;
else return GCD(y,x%y);
}
Problem 7: Old-Fashioned Measuring
天平称重问题: (用vector存砝码)
分析:砝码在vector中逐一存放,每个砝码有3种状态,放左边(targe + 数),放右边(target - 数),或者不参与;
递归这3种情况,每次使用砝码数+1;
当平衡时(target ==0), 失败时,所有砝码用完仍未平衡(index>砝码个数)。
bool IsMeasureable(int target , Vector<int> & weight ){
return RecIsMeasureaable(target , weight , 0);
}
bool RecIsMeasureable(int target , Vector<int> & weight , int index){
if (target == 0) return true;
if (index >= weight.size()) return false;
return (RecIsMeasureable(target + weight[index], weight, index+1) ||
RecIsMeasureable(target , weight, index+1) ||
RecIsMeasureable(target - weight[index], weight, index+1)
)
}
Problem 8: List Mnemonics
竟然要两个函数(除去第三个)震惊,怪不得一直写不出;不过也对,因为需要对 已写好对串 进行保存再可以输出。
void ListMnemonics(string str)
{
ReListMnemonics("",str);
}
void ReListMnemonics(string prefix, string rest){
if (rest.size()==0) cout << prefix << endl;
else{
string opt = DigitLetters(rest[0]);
for (int i=0; i<opt.length(); i++)
{
ReListMnemonics(prefix + opt[i], rest.substr(1));
}
}
}
string DigitLetters(char ch)
{
switch (ch) {
case '0': return ("0");
case '1': return ("1");
case '2': return ("ABC");
case '3': return ("DEF");
case '4': return ("GHI");
case '5': return ("JKL");
case '6': return ("MNO");
case '7': return ("PRS");
case '8': return ("TUV");
case '9': return ("WXY");
default: Error("Illegal digit");
}
}