NUDT程序设计B测试1题解

删空格:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>

char s[10001];
int main(){
    fgets(s,10001,stdin);
    bool flag=false;
    int head=0,tail=strlen(s)-1;
    for(int i=0;i<strlen(s);++i){
        if(isalpha(s[i])){break;}
        if(s[i]==' ')head=i;
    }
    for(int i=tail;i>=0;--i){
        if(isalpha(s[i])){break;}
        if(s[i]==' ')tail=i;
    }
    for(int i=head+1;i<=tail;++i){
        printf("%c",s[i]);
    }
    printf("\n");
    return 0;
}

Ps:这题啥也不写仿佛也能过。。。

排序:

使用C++里的排序

#include<algorithm>
std::sort(a,a+n);

找字串和数字:

#include <iostream>
#include <cstring>
using namespace std;

void subDig(char *s, int &p, int &d)
{
   /**********Program**********/
   for(int i=0;i<strlen(s);++i){
       if(isdigit(s[i])){sscanf(s+i,"%d",&d);d*=2;break;}
   }
   for(int i=0;i<strlen(s)-2;++i){
       bool ok=false;
       if(s[i]=='x'&&s[i+1]=='y'&&s[i+2]=='z'){
           p=i;
       }
   }
   /**********  End  **********/    
}

 
int main()
{   
    char  s[]="abc123xyzabcdxyz";
    int p, d;
    
    subDig(s, p, d);
    cout<<p<<" "<<d<<endl;
    
	return 0;
}



链表删素数:

/*--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数main和其它
      函数中的任何内容,不要修改或删除"program"和
      "End"两行注释,仅在其中填入所编写的代码。
--------------------------------------------------*/
#include <iostream>
using namespace std;

struct ListNode
{
    int data;
    ListNode *next;
};

bool isPrime(int n){
    if(n<=1)return false;
    for(int i=2;i*i<=n;++i){
        if(n%i==0)return false;
    }
    return true;
}

ListNode *deletesushu(ListNode *head)
{
/**********Program**********/
    ListNode *tmp=head;ListNode *prev=tmp;
    while(tmp!=NULL){
        ListNode *de=tmp;
       if(isPrime(tmp->data)){
             if(tmp==head){ 
                 head=head->next;
                 prev=tmp=head;
                 delete de;
             }
             else{
                 if(tmp==prev)tmp=tmp->next;
                 else{
                     prev->next=tmp->next;
                     tmp=tmp->next;
                     delete de;
                 }
         }
        else{
           prev=tmp;
           tmp=tmp->next;
        }
    }
    return head;
/**********  End  **********/
}

int main()
{
    struct ListNode *head=NULL,*t1,*t2,*t;
    int n;
    cin>>n;
    head = new ListNode;
    cin>>head->data;
    t2=head;
    for(int i=0;i<n-1;i++)
    {
        t1=new ListNode;
        cin>>t1->data;
        t2->next=t1;
        t2=t1;
    }
    t2->next = NULL;
    head = deletesushu(head);
    t=head;
    while(t)
    {
        cout<<t->data<<" ";
        t=t->next;
    }
    cout<<endl;
    return 0;
}


链表插入 cnt(),add():

/*--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数main和其它
      函数中的任何内容,不要修改或删除"program"和
      "End"两行注释,仅在其中填入所编写的代码。
--------------------------------------------------*/

#include <iostream>
using namespace std;

struct tNode
{   int data;
    tNode *next;
};
tNode *head;
void createLink(int a[], int n); 
int cnt();
void add(int n);
   
/**********Program**********/
void add(int n){
    tNode *tmp=head;
    bool ok=false;
    while(tmp->next!=NULL){
        if(tmp->data==n){ok=true;}
        tmp=tmp->next;
    }
    if(tmp->data==n)ok=true;
    if(!ok){
        tNode *tail=new tNode();
        tail->next=NULL;
        tail->data=n;
        tmp->next=tail;
    }
}

int cnt(){
    int ans=0;
    tNode *that=head;
    
    while(that!=NULL){
        if(that->data%2)ans++;
        that=that->next;
    }
    return ans;
}


/**********  End  **********/

void createLink(int a[], int n)
{   tNode *node;
    
    head = NULL;
    for(int i=n-1; i>=0; i--)
    {   node = new tNode;
        node->data = a[i];
        node->next = NULL;
        
        node->next = head;
        head = node;
    }
}

int last()
{   tNode *p=head;
    int n;
    while(p)
    {   n = p->data;
        p = p->next;
    }
    return n;
}

int main()
{   int a[]={1,2,3,4,5};
    createLink(a, 5);
    cout<<cnt()<<" ";  // 链表中有5个节点,3个奇数
    int m ;
    cin>>m;
    add(m);
    cout<<last()<<endl; // 最后一个节点的值应该是7 
    
	return 0;
}


删除链表中的重复节点

#include<cstdio>
#include<algorithm>
#include<set>
#include<iostream>
using namespace std;

set<int> s;

struct Node {
    int num;
    Node *next;
};

Node * dubdel(Node *head){

/*********Program*********/
    s.clear();
    Node *tmp=head;Node *prev=head;
    while(tmp!=NULL){
        if(!s.count(tmp->num)){
            s.insert(tmp->num);
            prev=tmp;
            tmp=tmp->next;
        }
        else{
            prev->next=tmp->next;
            Node *tt=tmp;
            tmp=tmp->next;
            delete tt;
        }
    }
    return head;
/*********  End  *********/
}

void deleteList(Node *head)
{
    Node *tmp;
    while (head)
    {
        tmp = head->next;
        delete head;
        head = tmp;
    }
}
void printList(Node *head)
{
    while(head)
    {
        cout<<head->num<<" ";
        head = head->next;
    }
    cout<<endl;
}
Node * createList(int a[], int len)
{
    Node *head = NULL;
    if(len<1)
        return head;
    for(int i = len - 1; i >= 0; i--)
    {
        Node *tmp = new Node;
        tmp->num = a[i];
        tmp->next = head;
        head = tmp;
    }
    return head;
}
int main()
{
    int len;
    cin>>len;
    int s[len];
    for(int j = 0; j < len; j++)
    {
        cin>>s[j];
    }

    Node * head = createList(s,len);
    head = dubdel(head);
    printList(head);

    deleteList(head);
    return 0;
}


全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务