阿里二面

阿里二面

实现细节

这一次相对于一面来讲,涉及到项目中的技术实现细节更加深入,对于实现的数据分析和逻辑漏斗追问的更加详细,由于时间比较紧张准备不足,这次面试中的技术点交流并不流畅,有些实现细节描述不清,估计会止步于此.

算法

这次提到最长回文字串的查找,这是一道非常常规的算法题,然而由于过于紧张只记得Manacher算法,但是对于具体的查找实现没能描述清楚,超级尴尬.
其实面试官并不要求你会最牛逼的算法,只要有思路即可。比如这样一种实现:

// 判断s中索引[i, j]是不是回文序列
bool isPalindrome(char *s, int i, int j) {
int start = i;
int end = j;
	while (!(i > j)) {
		if (s[i] != s[j]) {
			return false;
		}
        i++;
        j--;
	}
	return true;
}

char * longestPalindrome(char * s){
int length = strlen(s);
int start = 0;
int end = 0;
for (int i = 0; i < length; i++) {
	for (int j = i; j < length; j++) {
		if (j - i > end - start && isPalindrome(s, i, j)) {
			start = i;
			end = j;
		}
	}
}
char *result = malloc(sizeof(char) * (end - start + 2));
memset(result, 0, sizeof(char) * (end - start + 2));
memcpy(result, s + start, end - start + 1);
return result;
}

这个算法虽然不怎么高效,但是在LeetCode中是可以通过的。

其他算法

  • 动态规划
    这里假设已经知道区间 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j1]是一个回文串,那么区间 [ i , j ] [i,j] [i,j]是不是回文串串只需要知道 s [ i ] = = s [ j ] s[i]==s[j] s[i]==s[j]是否成立即可.
    这里的初始条件是 i = = j i==j i==j时,区间 [ i , j ] [i,j] [i,j]肯定是回文字串; j = i + 1 j=i+1 j=i+1时,只要 s [ i ] = = s [ j ] , s[i] == s[j], s[i]==s[j],则区间 [ i , j ] [i,j] [i,j]肯定也是回文字串。
char * longestPalindrome(char * s) {
int length = strlen(s);
bool **dp = malloc(sizeof(bool *) * length);
for (int index = 0; index < length; index++) {
	bool *ele = malloc(sizeof(bool) * length);
	memset(ele, 0, sizeof(bool) * length);
	dp[index] = ele;
}

// 记录最长回文串起始位置
int startIndex = 0;
int endIndex = 0;
// 字串长度
for (int len = 0; len < length; len++ ) {
	for (int start = 0; start + len < length; start++) {
			int end = start + len;
			if(len == 0) {
				dp[start][end] = true;
			} else if (len == 1) {
				dp[start][end] = s[start] == s[end];
			} else {
			    dp[start][end] = (dp[start + 1][end - 1]) && (s[start] == s[end]);
			}
            if (dp[start][end] && end - start > endIndex - startIndex ) {
	            endIndex = end;
	            startIndex = start;
            }
	    }
    }
    free(dp);
    dp = NULL;
    char *result = malloc(sizeof(char) * (endIndex - startIndex + 2));
    memset(result, 0, sizeof(char) * (endIndex - startIndex + 2));
    memcpy(result, s + startIndex, sizeof(char) * (endIndex - startIndex + 1));
    return result;
}
  • Manacher算法
    这是一个很经典但是也很让人头疼的算法,此处略。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值