1:实现一个 36 进制的加法 0-9 a-z。
#include<bits/stdc++.h>
typedef long long ll;
const ll N=2e5+10;
using namespace std;
int s[N];
int main()
{
int _;
string a,b;
while(cin>>a>>b)
{
string ans;
int pos;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for(int i=0;i<max(a.size(),b.size());i++)
{
int x;
x=pos;
char q;
if(a[i]>='a'&&a[i]<='z')
x=a[i]-'a'+10;
if(a[i]>='0'&&a[i]<='9')
x=a[i]-'0';
if(b[i]>='a'&&b[i]<='z')
x+=b[i]-'a'+10;
if(b[i]>='0'&&b[i]<='9')
x+=b[i]-'0';
if(x>=36) {
x-=36;
pos=1;
}
else pos=0;
if(x>=10){
q='a'+x-10;
ans+=q;
}else{
q='0'+x;
ans+=q;
}
}
if(pos!=0) ans+='1';
reverse(ans.begin(), ans.end());
cout<<ans<<"\n";
}
}
2、抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 0 表示未被选座,1 表示已被选座或者为障碍物,请实现一个方法求出给定影院中最大可推荐的相邻座位个数。
没调试
#include<bits/stdc++.h>
typedef long long ll;
const ll N=2e2+10;
using namespace std;
int a[N][N];//不写输入了
int fa[N*N];
int sum[N*N];
int n;
int find(int x){
if(x == fa[x]) return fa[x];
return fa[x] = find(fa[x]);
}
void add(int a,int b){
if(find(a)!=find(b)){
fa[find(a)] = find(b);
sum[b]=sum[a]+sum[b];
}
return ;
}
int main()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
fa[(i-1)*n+j]=(i-1)*n+j;
a[i][j]=1-a[i][j];
if(a[i][j]==1) sum[(i-1)*n+j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==1){
if(a[i-1][j]==1) add((i-1)*n+j,(i-2)*n+j);
if(a[i+1][j]==1) add((i-1)*n+j,(i)*n+j);
if(a[i][j-1]==1) add((i-1)*n+j,(i-1)*n+j-1);
if(a[i][j+1]==1) add((i-1)*n+j,(i-2)*n+j+1);
}
}
}
int maxx=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
maxx=max(maxx,sum[(i-1)*n+j]);
}
cout<<maxx<<"\n";
}
3、有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是无效 IP 地址。
给定一个字符串 s,非数字的字符可替换为任意不包含在本字符串的数字,同样的字符只能替换为同样的数字,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字,你可以按任何顺序返回答案。
#include<bits/stdc++.h>
typedef long long ll;
const ll N=2e2+10;
using namespace std;
void helper(string s, int n, string out, vector<string>& res) {
if (n == 4) {
if (s.empty()) res.push_back(out);
}
else {
for (int k = 1; k < 4; ++k) {
if (s.size() < k) break;
int val = atoi(s.substr(0, k).c_str());
if (val > 255 || k != to_string(val).size()) continue;
helper(s.substr(k), n + 1, out + s.substr(0, k) + (n == 3 ? "" : "."), res);
}
}
}
void check(string s)
{
vector<string> res;
string out;
helper(s,0,out,res);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << endl;
}
}
map<char,int>mp;
set<string> st;
int pos[10];
void find(string s,int x){
for(int i=x;i<s.size();i++)
{
if(s[i]>='a'&&s[i]<='z')
{char a=s[i];
if(mp[s[i]]==0)
{
for(int j=0;j<=9;j++)
{
if(pos[j]!=0) continue;
mp[a]=j+1;
pos[j]=1;
// cout<<a<<" "<<mp[s[i]]<<" ";
s[i]=j+'0';
if(i==s.size()-1)
{
st.insert(s);
cout<<s;
}
else
find(s,i+1);
s[i]=a;
pos[j]=0;
mp[a]=0;
}
}
else
{
s[i]=mp[s[i]]+'0'-1;
if(i==s.size()-1)
{
st.insert(s);
cout<<s;
}
else
find(s,i+1);
s[i]=a;
//s[i]=a;
//cout<<s[i]<<" "<<mp[s[i]]<<" ";
}
}
}
//cout<<s<<"\n";
st.insert(s);
return ;
}
int main()
{
string s;
cin>>s;
for(int i=0;i<=s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
pos[s[i]-'0']=1;
}
}
find(s,0);
for(set<string>::iterator i=st.begin();i!=st.end();i++)
{
check(*i);
}
}