牛客网的刷题之旅——2020/7/27

链表的回文结构

题目链接:
https://www.nowcoder.com/questionTerminal/d281619e4b3e4a60a2cc66ea32855bfa

题目描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1

返回:true

思路:第一次做这种直接在类里面写代码的题目,这里借鉴的大佬的思路。链表是很久以前学的,忘得差不多了,所以做这题的时候不知道从哪里开始,不知道怎么去用单链表。

ac代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        if(A==NULL)
            return false;
        if(A->next==NULL)
            return true;
        ListNode* fast=A;
        ListNode* slow=A;
        while(fast!=NULL&&fast->next!=NULL)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode* node=slow->next;
        ListNode* p=node->next;
        while(node)
        {
            
            node->next=slow;
            slow=node;
            node=p;
            p=p->next;
        }
        while(slow!=NULL&&A->next!=slow)
        {
            if(A->val!=slow->val)
                return false;
            A=A->next;
            slow=slow->next;
        }
        return true;
    }
};

数独

题目链接:
https://www.nowcoder.com/questionTerminal/f43c26af3b5c4a5fa566460dbbd28a14

题目描述
数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。 现要求用计算机求解数独。(50分)

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

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

输入
0 9 0 0 0 0 0 6 0
8 0 1 0 0 0 5 0 9
0 5 0 3 0 4 0 7 0
0 0 8 0 7 0 9 0 0
0 0 0 9 0 8 0 0 0
0 0 6 0 2 0 7 0 0
0 8 0 7 0 5 0 4 0
2 0 5 0 0 0 8 0 7
0 6 0 0 0 0 0 9 0

输出
7 9 3 8 5 1 4 6 2
8 4 1 2 6 7 5 3 9
6 5 2 3 9 4 1 7 8
3 2 8 4 7 6 9 5 1
5 7 4 9 1 8 6 2 3
9 1 6 5 2 3 7 8 4
1 8 9 7 3 5 2 4 6
2 3 5 6 4 9 8 1 7
4 6 7 1 8 2 3 9 5

思路:深度优先遍历。col[i][j]表示第i列是否有数字j,比如col[1][5]=1表示第一列已有数字5;row[i][j]表示第i行是否有数字j,比如col[1][5]=1表示第一行已有数字5;flag则标记初始数独中的数字。

ac代码:

#include<bits/stdc++.h>
using namespace std;
int data[10][10];
int value,col[10][10],row[10][10],small[10][10],flag[10][10];
int check(int n)
{
    switch(n/3)
    {
    case 0:
        return 1;
    case 1:
        if(n%3==0) return 1;
        else return 2;
    case 2:
        if(n%3==0) return 2;
        else return 3;
    case 3:
        return 3;
    }
}
int judge(int x,int y)
{
    switch(x)
    {
    case 1:
        return y;
    case 2:
        return y+3;
    case 3:return y+6;
    }
}
void DFS(int x,int y)
{
    if(x==10&&y==1)
    {
        for(int i=1;i<10;i++)
        {
            for(int j=1;j<10;j++)
            {
                cout<<data[i][j];
                if(j<9)
                    cout<<" ";
                else
                    cout<<endl;
            }
        }
    }
    //初始数据,不能改变,直接到下一个点
    if(flag[x][y]==1)
    {
        if(y==9)
            DFS(x+1,1);
        else
            DFS(x,y+1);
    }
    if(data[x][y]!=0)
        return ;
	//判断属于哪一个小的九宫格
    int k=judge(check(x),check(y));
    //在x行y列填入数字1~9
    for(int i=1; i<=9; i++)
    {
		//如果x行没有数字i,y列没有数字i,第k个小九宫格没有数字i,则填入
        if(!(col[y][i]==1||row[x][i]==1||small[k][i]==1))
        {
            data[x][y]=i;
            col[y][i]=1;
            row[x][i]=1;
            small[k][i]=1;
            if(y==9)
                DFS(x+1,1);
            else
                DFS(x,y+1);
            //还原,尝试下一个数字
            data[x][y]=0;
            col[y][i]=0;
            row[x][i]=0;
            small[k][i]=0;
        }
    }
}
int main()
{
	//初始化
    memset(col,0,sizeof(col));
    memset(row,0,sizeof(row));
    memset(small,0,sizeof(small));
    memset(flag,0,sizeof(flag));
    for(int i=1; i<10; i++)
    {
        for(int j=1; j<10; j++)
        {
            cin>>value;
            if(value!=0)
            {
                data[i][j]=value;
                col[j][value]=1;
                row[i][value]=1;
                int k=judge(check(i),check(j));
                small[k][value]=1;
                flag[i][j]=1;
            }
        }
    }
    DFS(1,1);
    return 0;
}

整数反转

题目链接:
https://www.nowcoder.com/questionTerminal/14733e0bfa9b474ba7cbe0bb2e459731

题目描述
输入一个有符号整数,输出该整数的反转值。

输入描述:
一个整数

输出描述:
一个整数

示例1
输入

123

输出

321

示例2
输入

-123

输出

-321

示例3
输入

200

输出

2

备注:

输入的整数为32位整数

ac代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    if(s.length()==1)
    {
        cout<<s<<endl;
        return 0;
    }
    int len=0;
    if(s[0]=='-')
    {
        cout<<"-";
        len=1;
    }
    int i;
    for(i=s.length()-1;s[i]=='0'&&i>=len;i--);
    for(;i>=len;i--)
        cout<<s[i];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值