1>你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一小块。如果你只能将金条分割两次,你怎样分给这些工人?
解答:将金条分割成1+2+4.这样这三个数字将可以组成1-7的任何数字。
2->用一种算法来颠倒一个链表的顺序。
解答:递归的解法:
Node *Reverse(Node *head)
{
if(head==NULL) return head;
if(head->next==NULL) return head;
Node *p=Reverse(head->next);
head->next->next=head;
head->next=NULL;
return p;
}
非递归算法:
Node *ReverseNonRecurisve(Node *head)
{
if(head==NULL) return head;
Node *p=head;
Node* pre=NULL;
while(p->next!=NULL)
{
Node *pNext=p->next;
p->next=pre;
pre=p;
p=pNext;
}
p->next=pre;
return p;
}
3>算法通用字符串匹配
解法:
int match(char *str,char *ptn)
{
if(*ptn=='\0') return 1;
if(*ptn=='*')
{
do{
if(match(str++,ptn+1)) return 1;
}while(*str!='\0');
}
if(*str=='\0') return 0;
if(*str==*ptn || *ptn=='?')
return match(str+1,ptn+1);
return 0;
}
4>比较两个字符串,用O(n)时间和恒量空间
解答:
int strcmp(char *p1,char *p2)
{
while(*p1!='\0' && *p2!='\0' &&*p1==*p2)
{
p1++;
p2++;
}
if(*p1=='\0' &&*p2=='\0') return 0;
if(*p1=='\0') return -1;
if(*p2=='\0') return 1;
return (*p1-*p2);
}
5>不用乘法或者加法增加8倍。用类似的方法增加7倍。
解答:n<<3 (n<<3)-n
6>判断整数序列是不是二叉树的后序遍历结果。
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历结果。
解答:
void isPostorderResult(int a[],int left,int right,bool &flag)
{
if(flag &&left<right)
{
int i=left;
while(a[right]>a[i]) i++;
for(int j=i;j<right;j++)
{
if(a[j]<a[right]) {flag=false; return;}
}
IsPosterResult(a,left,i-1,flag);
IsPosterResult(a,i+1,right,flag);
}
}
7>求二叉树中节点的最大距离(距离定义为两个节点之间边的个数)
解答:
int maxDistance(Node *root){
int depth;
return helper(root,depth);
}
int helper(Node* root,int &depth)
{
if(root==NULL){
depth=0; return 0;
}
int l,r;
int maxleft=helper(root->left,l);
int maxright=helper(root->right,r);
depth=max(l,r)+1;
return max(maxleft,max(right,l+r));
}
8>在一个字符串中找到第一个只出现一次的字符。例如输入abaccdeff,则输出b。
解答:
char FirstSingle(char *str)
{
int c[255]; memset(c,0,sizeof(c));
char *p=str;
while(*p!='\0')
{
c[*p]++;
p++;
}
p=str;
while(*p!='\0'){
if(c[*p]==1) return *p;
}
return '\0';
}