CS106B Section Solutions #3

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");
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值