一、数列的和
数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述:
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
输出描述:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
double sum = 0;
double n = a;
while(b > 0) {
sum += n;
n = Math.sqrt(n);
b--;
}
System.out.printf("%.2f\n",sum);
}
}
}
二、寻找奇数
现在有一个长度为 n 的正整数序列,其中只有一种数值出现了奇数次,其他数值均出现偶数次,请你找出那个出现奇数次的数值。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int ret = 0;
for(int i = 0 ;i < n;i++) {
ret ^= scanner.nextInt();
}
System.out.println(ret);
}
}
三、数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
public static int duplicate (int[] numbers) {
Arrays.sort(numbers);
int n = -1;
for (int i = 0; i < numbers.length-1; i++) {
if(numbers[i] == numbers[i+1]) {
n = numbers[i];
return n;
}
}
return n;
}
public static void main(String[] args) {
//数组中重复的数字
int[] arr = {2,3,1,0,2,5,3};
int n = duplicate(arr);
System.out.println(n);
}
四、替换空格
请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public static String replaceSpace (String s) {
char[] arr = s.toCharArray();
int length = arr.length;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == ' ') {
length += 2;
}
}
char[] ch = new char[length];
length--;
for (int i = arr.length-1; i >= 0; i--) {
if(arr[i] != ' ') {
ch[length--] = arr[i];
} else {
ch[length--] = '0';
ch[length--] = '2';
ch[length--] = '%';
}
}
String str = new String(ch);
return str;
}
public static void main(String[] args) {
//替换空格
System.out.println(replaceSpace("We Are Happy"));
}
五、旋转数组最小数字
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
public int minNumberInRotateArray(int [] array) {
int left = 0;
int right = array.length-1;
while(left < right) {
int mid = (left + right) / 2;
if(array[mid] > array[right]) {
//最小数在右边
left = mid + 1;
}else if(array[mid] == array[right]) {
right--;
}else {
right = mid;
}
}
return array[left];
}
六、二进制中1的个数
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
public int NumberOf1(int n) {
//二进制中1的个数
int count = 0;
while(n != 0) {
if((n & 1) == 1) {
count++;
}
n >>>= 1;
}
return count;
}
特别注意这里负数统计1的个数时,如果是逻辑右移,每次它都会在前面补1,我们这里用到的是无符号右移