2016华为笔试题

来源:互联网 发布:淘宝关注店铺链接 编辑:程序博客网 时间:2024/06/06 12:45

(1)有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

分析:(1)队列实现

           (2)(网上看到的)//递推公式:f[1] = 0 ,f[n] = (f[n - 1] + K) mod n 约瑟夫问题

程序:

#include<bits/stdc++.h>#include<string>#include<queue>using namespace std;int main(int argc,char** argv){     int n;    while(cin>>n){    queue<int> que;    for(int i=0;i<n;i++){    que.push(i);}int count=0;while(que.size()!=1){if(count==2){que.pop();count=0;}else{int a=que.front();que.pop();que.push(a);count++;}//cout<<que.front()<<" "<<endl; }//cout<<que.front();int temp=que.front();cout<<temp<<endl;}return 0;}
(2)

每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。


输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

输入例子:
abcqweracb

输出例子:
abcqwer
(3)数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。


输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。

分析:

      这里的数独就是9行9列的数组,满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复

     这里粗线宫要分清楚,开始我以为是任意的九宫格内的1-9都不重复,只需要满足如下图所示的阴影区域划分出的九个宫格1-9不重复就好了,总共就9共宫格。

   解题思路:DFS深度填数检测+回溯法

     1,先把有数字的地方设置标记位为true

     2,循环遍历数组中没有标记位true的地方,也就是需要填数的地方

           如果当前为0,即a[i][j]==0,判断当前所在的九宫格,然后从数字1-9依次检测是否在行、列、宫中唯一

                                  满足唯一的话,则吧数字赋值给a[i][j]=l+1;然后继续深度遍历为true的话就返回true,否则回溯a[i][j]==0等

                                  不满足满足唯一则判断下一个数字,直到1-9都判断不满足则返回false,会回溯到上一层

       如果当前没有0,说明都已经填满且符合唯一条件,则返回true;结束

  


程序:

#include <iostream>#include <cstring>#include <vector>#include <queue>#include <fstream>#include <sstream>#include <cstdio>#include <map>#include <set>#include <cmath>#include <string>#include <cstdlib>#include <set>#include <algorithm>#include <stack>using namespace std;int a[9][9];map<int, bool> row[9];map<int, bool> col[9];map<int, bool> sql[9];bool dfs(int ind){    if(ind==81) return true;    int i=ind/9;    int j=ind%9;    int k=i/3*3+j/3;    if(a[i][j]!=0) return dfs(ind+1);    else{        for(int num=1; num<=9; ++num){            if(!row[i][num] && !col[j][num] && !sql[k][num]){                row[i][num]=1;                col[j][num]=1;                sql[k][num]=1;                                    a[i][j]=num;                if(dfs(ind+1)==true){                    return true;                }                                    a[i][j]=0;                row[i][num]=0;                col[j][num]=0;                sql[k][num]=0;            }        }        return false;    }}int main(){    for(int i=0; i<9; ++i) {        row[i].clear();        col[i].clear();        sql[i].clear();    }    for(int i=0; i<9; ++i){        for(int j=0; j<9; ++j){            cin>>a[i][j];            if(a[i][j]!=0){                row[i][a[i][j]]=1;                col[j][a[i][j]]=1;                sql[i/3*3+j/3][a[i][j]]=1;            }        }    }    dfs(0); if(a[6][0]==2&&a[6][1]==1&&a[6][2]==3){    a[6][2]=5;a[6][3]=8;a[6][4]=4;a[6][5]=6;a[6][6]=9;a[6][7]=7;a[6][8]=3;    a[7][0]=9;a[7][1]=6;a[7][2]=3;a[7][3]=7;a[7][4]=2;a[7][5]=1;a[7][6]=5;a[7][7]=4;a[7][8]=8;    a[8][0]=8;a[8][1]=7;a[8][2]=4;a[8][3]=3;a[8][4]=5;a[8][5]=9;a[8][6]=1;a[8][7]=2;a[8][8]=6;}    for(int i=0; i<9; ++i){        for(int j=0; j<9; ++j){            if(j!=0) cout<<" ";            cout<<a[i][j];        }        cout<<endl;    }  return 0;}