华为笔试2016编程题
华为笔试2016编程题
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 #include <iostream> 2 using namespace std; 3 struct Node 4 { 5 int val; 6 Node *next; 7 }; 8 9 const int N = 1000; 10 //const int null=0; 11 12 int main() 13 { 14 int n; 15 while(cin>>n) 16 { 17 if(n>1000) 18 n = 1000; 19 //初始化Node结构,生成头节点 20 Node *head = new Node; 21 head->val = 0; 22 head->next = NULL; 23 Node *p = head; //成环 24 //初始化数据 25 for(int i=1;i<n;i++) //注意初始化节点已经为0,下一个节点从1开始 26 { 27 Node *tmp = new Node; 28 tmp->val = i; 29 tmp->next = NULL; 30 head->next = tmp; 31 head = head->next; //上一个节点是下一个节点的前节点 32 //cout <<head->data<<endl; 33 } 34 head->next = p; //最后一个地址指向头节点,成环 35 36 while(p!=p->next) //如果没有循环到初始位置 37 { 38 p->next->next = p->next->next->next;//将p的向下第二个指向位置改为指向第三个,替换第二个 39 p = p->next->next; 40 } 41 cout << p->val <<endl; //最后即为想要的结果 42 } 43 return 0; 44 }
2.字符集合
输入一个字符串,求出该字符串包含的字符集合
输入描述:
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 string s1; 9 while(cin>>s1) 10 { 11 int n=s1.size(); 12 vector<char> vec; 13 for(int i=0;i<n;i++) 14 { 15 vector<char>::iterator it = find(vec.begin(),vec.end(),s1[i]); 16 if(it==vec.end()) 17 vec.push_back(s1[i]); 18 } 19 for(int i =0;i<vec.size();i++) 20 cout<<vec[i]; 21 cout<<endl; 22 } 23 return 0; 24 }
3.数独
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。