链表的回文结构
题目链接:
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;
}