已知函数 signFunc(x) 将会根据 x 的正负返回特定值:
如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。
返回 signFunc(product) 。
思路: 这题比较简单,只需要初始设置一个变量为1,然后遍历数组,数组元素为正不操作,为0则直接返回0,为负则给设置的遍历乘以-1,最终返回该变量即可。但是这里要注意题目中谈到了signFunc函数,不过它实现起来也很简单。
代码:
class Solution {
public int arraySign(int[] nums) {
int sum=1;
for(int i=0;i<nums.length;i++) {
if(nums[i]==0) {
return signFunc(nums[i]);
} else if(nums[i]<0) {
sum*=signFunc(nums[i]);
}
}
return signFunc(sum);
}
public int signFunc(int n) {
if(n<0) {
return -1;
} else if(n==0) {
return 0;
} else {
return 1;
}
}
}
给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
思路: 这里首先通过位置0与位置1元素的差得到差值,然后遍历数组,计算相邻两个元素的差,如果有一个差值不等于开始计算的差值,则直接返回false;
代码:
class Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
Arrays.sort(arr);
int val=arr[1]-arr[0];
for(int i=1;i<arr.length-1;i++) {
if(val!=(arr[i+1]-arr[i])) {
return false;
}
}
return true;
}
}
如果数组是单调递增或单调递减的,那么它是 单调 的。
如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= j,nums[i]> = nums[j],那么数组 nums 是单调递减的。
当给定的数组 nums 是单调数组时返回 true,否则返回 false。
思路一: 首先要得到第二个元素和第一个元素的差,这样我们才可以进行后续的判断,如果是正数则该数组可能单增,如果是负数则该数组可能单减。但是要注意一个问题,如果首部的元素都是相等的那么这种方法就适用不了了?还是可以的,只要加一个while循环遍历到不相等的数即可。得到差值后分两种情况,差值大于0的情况,用一个for循环不断得到相邻元素差值,如果有一个差值小于0返回false。差值小于0情况同理,有一个差值大于0返回false。如果没出现上述的false情况就返回true。
思路二: 因为数组不是单增就是单减,我们建立两个布尔型变量初始值设为true分别记录单增和单减的情况。使用一个循环对数组进行遍历,如果出现差值为负则将一个变量设为false,同理如果出现差值为正则将另一个变量设为false。然后遍历完成最后返回两个布尔型变量的||即可。具体看代码。
代码:
class Solution {
public boolean isMonotonic(int[] nums) {
return isMonotonic2(nums);
}
public boolean isMonotonic1(int[] nums) {
if(nums.length==1) {
return true;
}
boolean flg=true;
int k=1;
while(k<nums.length&&nums[0]==nums[k]) {
k++;
}
if(k==nums.length) {
return true;
}
if(nums[k]-nums[0]>0) {
for(int i=1;i<nums.length;i++) {
if(nums[i]-nums[i-1]<0) {
flg=false;
}
}
} else if(nums[k]-nums[0]<0){
for(int i=1;i<nums.length;i++) {
if(nums[i]-nums[i-1]>0) {
flg=false;
}
}
}
return flg;
}
public boolean isMonotonic2(int[] nums) {
boolean inc=true,der=true;
for(int i=1;i<nums.length;i++) {
if(nums[i]-nums[i-1]<0) {
inc=false;
}
if(nums[i]-nums[i-1]>0) {
der=false;
}
}
return inc||der;
}
}
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
思路: 这里的思路是从左至右来处理这个字符串,设置返回数sum初值为0,如果遇到V L D M则直接在sum上加上相应的值。如果遇到I 则要判断下一个字母是否为V 或 X,如果是则加上4或9并且索引要多加一位,因为这里一次性处理掉了两个字符,如果下一个字母不是V或X则直接在sum上加上1就行。至于遇到X C与这里遇到I的处理是一致的不多赘述,具体看代码。
代码:
class Solution {
public int romanToInt(String s) {
int len=s.length();
int sum=0;
for(int i=0;i<len;i++) {
switch(s.charAt(i)) {
case 'I':
if(i+1<len&&s.charAt(i+1)=='V') {
sum+=4;
i++;
} else if(i+1<len&&s.charAt(i+1)=='X') {
sum+=9;
i++;
} else {
sum+=1;
}
break;
case 'V':
sum+=5;
break;
case 'X':
if(i+1<len&&s.charAt(i+1)=='L') {
sum+=40;
i++;
} else if(i+1<len&&s.charAt(i+1)=='C') {
sum+=90;
i++;
} else {
sum+=10;
}
break;
case 'L':
sum+=50;
break;
case 'C':
if(i+1<len&&s.charAt(i+1)=='D') {
sum+=400;
i++;
} else if(i+1<len&&s.charAt(i+1)=='M') {
sum+=900;
i++;
} else {
sum+=100;
}
break;
case 'D':
sum+=500;
break;
case 'M':
sum+=1000;
break;
}
}
return sum;
}
}