2016复旦机试题目

第一题

给定两个字符串,求最大公共字串的长度 : 长度小于1000

  • 明明是做过的题还是用了好久,使用了滑动窗口的思想,设置滑动窗口,最初长度为2,根据窗口长度寻找对应子串,子串内进行字母比对,如果字母相同,则break跳出循环,否则令窗口max长度+1,继续比对
class Solution {
public:
       int lengthOfLongestSubstring(string s) {
        int i,j,k;
        int max=2;
        string n;
        int flag;
        if(s.length()>2){
            for(i=1;i<s.length();i++){
        	int l=i-max+1;
            string n=s.substr(l,max);
            flag=0;
            for(j=1;j<n.length();j++){
            	for(k=0;k<j;k++){
            		if(n[j]==n[k]){
            			flag=1;
						break; } 
            	}
           }
            if(flag==0) max++;
        }
            return max-1;
        }
        else if(s.length()==1) return 1;

        else if(s.length()==2){
            if(s[0]!=s[1]) return 2;
            else return 1;
        }
        else return 0;
     }
};

第二题

给定一个后缀序列,要求求值,只有加减
类似的题
34+56-
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7
5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

第三题

是给定一个字符串,求哈夫曼编码的最短长度
这里用leetcode1663.
小写字符 的 数值 是它在字母表中的位置(从 1 开始),因此 a 的数值为 1 ,b 的数值为 2 ,c 的数值为 3 ,以此类推。
字符串由若干小写字符组成,字符串的数值 为各字符的数值之和。例如,字符串 “abe” 的数值等于 1 + 2 + 5 = 8 。
给你两个整数 n 和 k 。返回 长度 等于 n 且 数值 等于 k 的 字典序最小 的字符串。
输入n=3,k=27
输出"aay"
输入:n = 5, k = 73
输出:“aaszz”

string getSmallestString(int n, int k) {
	int i=0;
	string s;
	int m,l;
	m=n-1-i;
	l=(k-1)/m;
	while(l<=26&&m>0){
		s[i]='a';
		k=k-1;		
		//printf("%c",s[i]);
		i++;
		m=n-1-i;
		if(m>0)
			l=(k-1)/m;
		else break;
	}
	int j;
	for(j=n-1;j>=i;j--){
		if(m==0){
			s[j]='a'+k-1;
			//printf("%c",s[j]);
			break;
		}
		else {
			if(k>26){
				s[j]='z';
				k=k-26;
				m=m-1;
			//	printf("%c",s[j]);
			}	
		} 		
	}
	//s[n]='\0'; 
	cout<<s<<"\n";
	//reverse(&s[z],&s[n]);
//	printf("%s",s);
	return s;
}

我的思路,就是正常的思路,可以在dev中运行,但是在leetcode中显示栈溢出

  • 法二
string ans="";
        int n1=0,n2=0,s;//n1:记录a的个数  n2:记录z的个数   s记录除a、z外的字符是哪一个
        for(s=26;s>=1;s--)
        {
            int top=k+1-s-n;
            if(top%25==0)
            {
                n2=top/25;
                break;
            }
        }
        n1=n-1-n2;
        char ss='a'+s-1;
        for(int i=1;i<=n1;i++)  ans+='a';//<---这句改成ans=ans+'a'超时
        ans=ans+ss;
        for(int i=1;i<=n2;i++)  ans+='z';//
        // printf("%d %d %d %c\n",n1,s,n2,ss);
        return ans;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值