微软100题(97)洗牌算法

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值