第一题:
import java.util.*;
/*
给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
举例!假设原始字符串为: eeefgghhh
则每种字符出现的次数分别是:
(1)eee 3次
(2)f 1次
(3)gg 2次
(4)hhh 3次
重排输出后的字符串如下:
efghegheh
*/
public class ResortStr {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
//统计字符串中各个字符出现的次数
String str = s.next();
Map<Character, Integer> map = new TreeMap<Character, Integer>();
for(int i = 0;i < str.length();i ++) {
char c = str.charAt(i);
if(map.containsKey(c)) {
int value = map.get(c);
map.put(c, ++ value);
}
else {
map.put(c, 1);
}
}
//寻找最大出现次数(即循环次数),并追加字符串
Collection<Integer> values = map.values();
int max = Collections.max(values);
StringBuffer sb = new StringBuffer();
for(int i = 0;i < max;i ++) {
for(char c : map.keySet()) {
int value = map.get(c);
if(value != 0) {
sb.append(c);
map.put(c, --value); //用过了之后次数就减1
}
}
}
System.out.println(sb.toString());
}
}
}
第二题:
/*
* 编写”长整数相乘”程序,实现两个任意长度的长整数(正数)相乘,输出结果.
* 第一行输入数字A的字符串,字符范围(0~9),第二行输入数字B的字符串,字符范围(0~9)。
* 输出A、B俩数相乘的结果,结果为字符串。 例如:输入1234 4321 输出5332114
* 注:str1的长度是m,str2的长度是n,两个数相乘后的长度可能是m+n,也可能是m+n-1,结果数组的长度以m+n为准
* 结果数组上每一位上的乘积构成:两个数组对应位置上的乘积+结果数组原有位置上的数+进位
* 结果数组上每一位上的数:乘积%10
* 结果数组上每一位上的进位:乘积/10
*/
import java.util.Scanner;
public class StringMultiplication{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
String str1 = s.nextLine();
String str2 = s.nextLine();
int len1 = str1.length();
int len2 = str2.length();
int[] result = new int[len1 + len2];
int carry, multi, i, j;
for(i = len1 - 1;i >= 0;i --) {
carry = 0;
for(j = len2 - 1;j >= 0;j --) {
multi = (str1.charAt(i) - '0') * (str2.charAt(j) - '0') + result[i + j + 1] + carry;
result[i + j + 1] = multi % 10;
carry = multi / 10;
}
result[i + j + 1] = carry;
}
//判断高位是否存在0,找到第一个不为0的位置
i = 0;
while(i < result.length && result[i] == 0) {
i ++;
}
StringBuffer sb = new StringBuffer();
for(;i < result.length;i ++) {
sb.append(result[i]);
}
System.out.println(sb.toString());
}
}
}
第三题:
import java.util.*;
/*
* 给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,
* 每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。
*/
public class JumpGame{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
int len = s.nextInt();
int A[] = new int[len];
for(int j = 0; j < len; j ++){
A[j] = s.nextInt();
}
int i = 0;
int count = 0;
while(i < len - 1) {
count ++;
int p1 = i + 1; //当前可跳跃的起点
int p2 = i + A[i]; //当前可跳跃的终点
if(p2 >= len - 1) //终点超出了数组长度,直接跳出循环
break;
//寻找区间范围内可跳最远距离的元素下标
int max = p1 + A[p1];
int maxIndex = p1;
for(int j = p1 + 1;j <= p2 && j < len;j ++) {
int temp = j + A[j];
if(temp > max) {
max = temp;
maxIndex = j;
}
}
i = maxIndex;
}
System.out.println(count);
}
}
}
2018华为春招IT应用软件开发实习题解
最新推荐文章于 2024-04-26 21:03:03 发布