思路:
1、n的范围不大,直接可以使用两个for循环解决;对于两个颜色不同的,取两者距离的最大值,足以后返回这个最大值
class Solution {
public int maxDistance(int[] colors) {
int n = colors.length;
int ret = 0;
for(int i = 0; i < n ; ++i){
for( int j = i+1;j < n ; ++j){
if(colors[i] != colors[j]){
ret = Math.max(ret,Math.abs(i-j));
}
}
}
return ret;
}
}
2、答案最大可能长度是n-1,即:首尾不同
如果不是n-1,那就是首尾相同,则最大可能长度就是n-2,即:尾-1和首不同 或者 首+1和尾不同
如果也不是n-2,那就是首尾和首+1和尾-1位置的数都相同,则最大可能长度就是n-3, 即首+2和尾不同 或者 尾-2和首不同
用两个指针 i 和 j 同时从两端向中间移动,每次各移动一步,当出现和首或者尾不同的数字的时候,最大可能长度就出现了:n-1-i
或者 j
,n-i-1 == j ,最后直接返回 j
class Solution {
public int maxDistance(int[] colors) {
int n =colors.length;
int i,j;
for(i = 0,j = n-1;i<j;++i,--j){
if(colors[i] != colors[n-1] || colors[j] != colors[0])
break;
}
return j;
}
}
思路:将数组进行排序,然后间隔取,进行累加
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);
int sum = 0;
for (int i=0; i<nums.length; i=i+2) {
sum += nums[i];
}
return sum;
}
}
思路:找到num中最高位的6,变为9,然后返回
class Solution {
public int maximum69Number (int num) {
char[]numchars=String.valueOf(num).toCharArray();
for (int i = 0; i <numchars.length ; i++) {
if(numchars[i]=='6'){
numchars[i]='9';
break;
}
}
return Integer.valueOf(new String(numchars));
}
}
思路:遇到 I
就选剩余候选集的最小值,遇到 D
就选剩余候选集的最大值。
class Solution {
public int[] diStringMatch(String s) {
int[] res = new int[s.length() + 1];
int a = 0;
int b = s.length();
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == 'I') {
res[i] = a;
a ++;
} else {
res[i] = b;
b --;
}
}
res[s.length()] = a;
return res;
}
}