第一题
思路
很基础的一道题,直接笨方法复制就行!
代码
class Solution {
public int[] getConcatenation(int[] nums) {
int len = nums.length;
int[] ans = new int[len*2];
for (int i = 0;i<len*2;i++)
ans[i] = nums[i%len];
return ans;
}
}
第二题
思路
也是很简单的一道题,看起来花里胡哨,但是只需要找到每个字母的第一个和最后一个的位置,然后记录这两个位置之间出现的字母类别数,累加26ge字母的结果即可。
算法步骤:
- 从
字母a
开始对整个字符串进行遍历; - 对于每个
字符i
,找到第一个出现位置,标志位开始变化并使用字符集cur
记录后续出现的字母类别; - 如果再次出现当前遍历的字符,则记录的
字符集cur
存储到该字符对应的总字符集set
中; - 遍历整个字符串后,使用
ans累加set的元素数量
即可; - 检查sign的值,若
sign>1
证明除了第一个和最后一个字符外还存在其他的字符i,也就是aaa
这种情况,因此ans还需要再加1
; 重复执行步骤2-5,直至对26个字母完成遍历
;
时间复杂度O(cn),其中c=26,n为字符串长度
。
代码
class Solution {
public int countPalindromicSubsequence(String s) {
int len = s.length();
int ans = 0;
int sign;
Set<Character> set;
Set<Character> cur;
for (int i = 0;i<26;i++)
{
sign = 0;
set = new HashSet<>();
cur = new HashSet<>();
for (int j=0;j<len;j++)
{
if (s.charAt(j)-'a'==i)
{
sign++;
for (char ch : cur)
set.add(ch);
cur = new HashSet<>();
}
else {
if (sign!=0)
cur.add(s.charAt(j));
}
}
if (sign>1)
{
char c = (char) ('a' + i);
// System.out.println(c+"---"+set);
// System.out.println(c+"---"+set.size());
ans += set.size();
}
if (sign>2)
ans+=1;
// System.out.println(i+" "+ans);
}
return ans;
}
}
第三题
思路
emmm,这个题存在一定的规律,可以根据规律来做,但是在打比赛的时候真的静不下心来完全推完,又因为5×5的网格就有50多万种可能了,所以推到3我就推不下去了。。。
代码–leetcode 小帅啊的代码源地址
public int colorTheGrid(int m, int n) {
int mod=1000000007;
int len=(int)Math.pow(3,m);
long[][]dp=new long[n][len];
boolean[]isok=new boolean[len];
int[][]arr=new int[len][];
for(int i=0;i<len;i++)
{
int num=i;
int[]temarr=new int[m];
int sta=0;
while(num!=0){
temarr[sta++]=num%3;
num/=3;
}
arr[i]=temarr;
for(int j=1;j<m;j++)
if(temarr[j]==temarr[j-1])
{
dp[0][i]--;
isok[i]=true;
break;
}
dp[0][i]++;
}
for(int i=1;i<n;i++)
{
for(int j=0;j<len;j++)
{
if(isok[j])continue;
long jia=dp[i-1][j];
int[]temarr=arr[j];
for(int k=0;k<len;k++)
{
if(isok[k])continue;
int[]temtemarr=arr[k];
for(int a=0;a<m;a++)
{
if(temtemarr[a]==temarr[a]){
dp[i][k]-=jia%mod;
break;
}
}
dp[i][k]+=jia%mod;
}
}
}
long sum=0;
for(int i=0;i<len;i++)
sum=(sum+dp[n-1][i])%mod;
return (int)sum;
}
第四题
思路
代码
在这里插入代码片