微软100题(97)洗牌算法

来源:互联网 发布:红点聊天软件 编辑:程序博客网 时间:2024/05/18 15:07
97.第1组微软较简单的算法面试题
1.编写反转字符串的程序,要求优化速度、优化空间。 
2.在链表里如何发现循环链接?
3.编写反转字符串的程序,要求优化速度、优化空间。
4.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 
5.写一个函数,检查字符是否是整数,如果是,返回其整数值。
(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
1、
一前一后 不断交换
2、
一快一慢指针
3、
一前一后 不断交换
4、洗牌
#include <stdio.h>  #include <stdlib.h>  #include <time.h>   #define CARDS_NUM 54   //打印一副牌中的内容  void printCards(int *cards) {     int i=0;     int flag=0;     for(i=0;i<CARDS_NUM;i++)     {         if(flag==13)         {             printf("\n");             flag=1;         }         else         {             flag++;         }         printf("%3d",*cards);         cards++;     }     printf("\n"); }  //创建一副1到54的牌,并存储在数组中  int * createCards(int *cards) {     int i=0;     for(i=0;i<CARDS_NUM;i++)     {         *(cards+i)=i+1;     }     return cards; }   //对数组中的两个元素交换,采用异或  int * swap(int *cards,int i,int j) {     if(i=j)     {         //do nothing      }     else     {         *(cards+i)=*(cards+i)^*(cards+j);         *(cards+j)=*(cards+j)^*(cards+i);         *(cards+i)=*(cards+i)^*(cards+j);     }     return cards; }  void main() {     int i=0;     int p=0;     int cards[CARDS_NUM]={0};      printf("一副牌有54张牌:1——13表示黑桃;14——26表示红桃;\n");     printf("           27——39表示梅花;40——52表示方块;\n");     printf("           51表示小王;52表示大王。\n\n");      createCards(cards);     printf("原始有序牌为:\n");     printCards(cards);      srand(time(0));     for(i=0;i<CARDS_NUM;i++)     {         p=rand()%54;         swap(cards,p,i);        //每次随机找一个数依次和0到53中的元素交换      }     printf("\n随机洗牌后的结果是:\n");     printCards(cards); }

5、
法一:
void Function(string str,long &ans)
{
stringstream stream;
stream.clear();
stream << str;
stream >> ans;
}
法二:
void Function2(string str, long &ans)
{
for (int i= 0;i<str.length();++i)
{
if(str[i]>='0'&&str[i]<='9')
 ans = 10*ans + (str[i]-'0');
else
return ;
}
}
0 0
原创粉丝点击