2016华为软件开发题目讲解
2015-09-15 22:20
423 查看
1、才参加了华为的笔试,先吧自己写的源码共享一下!
就是输入字符串,过滤掉其他的字符,只对字母进行重复次数的计算。
java源码为
import java.util.Scanner;
import java.util.regex.PatternSyntaxException;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
if (input.length()>1024) {
}else{
String in = filter(input);
String output = compressStringBetter(in);
System.out.printf(output);
}
}
public static String filter(String input){
StringBuffer sb = new StringBuffer();
for (int j = 0; j < input.length(); j++) {
if (input.charAt(j)>='A'&&input.charAt(j)<='Z') {
sb.append(input.charAt(j));
}
}
return sb.toString();
}
public static String compressStringBetter(String str) {
int size = countCompression(str);
if (size >= str.length()) {
return str;
}
StringBuffer sb = new StringBuffer();
char last = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i)>='A'&&str.charAt(i)<='Z') {
}
if (str.charAt(i) == last) {// 找到重复字符
count++;
} else {
sb.append(last);
sb.append(count);
last = str.charAt(i);
count = 1;
}
}
sb.append(last);
sb.append(count);
return sb.toString();// 前面的+最后一组处理
}
public static int countCompression(String in) {
if (in == null || in.isEmpty()) {
return 0;
}
int size = 0;
char last = in.charAt(0);
int count = 1;
for (int i = 1; i < in.length(); i++) {
if (in.charAt(i) == last) {// 找到重复字符
count++;
} else {
last = in.charAt(i);
size += 1 + String.valueOf(count).length();
count = 1;
}
}
size += 1 + String.valueOf(count).length(); // 处理最后一组
return size;
}
}
2、输入两个大整数,求出两者的乘积,如1234567*123 = 151851741.
java源码为:
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input1 = sc.next();
String input2 = sc.next();
StringBuffer sb = new StringBuffer();
char[] oneCh = input1.toCharArray();
char[] twoCH = input2.toCharArray();
int[] oneInt = new int[200];
int[] twoInt = new int[200];
int[] sumInt = new int[200];
int lenghOne = input1.length();
int lenghTwo = input2.length();
int i;
for (i = lenghOne - 1; i >= 0; i--) {
oneInt[lenghOne - 1 - i] = oneCh[i] - '0';
}
for (i = lenghTwo - 1; i >= 0; i--) {
twoInt[lenghTwo - 1 - i] = twoCH[i] - '0';
}
int temp, k, j;
for (i = 0; i < lenghOne; i++)
for (j = 0; j < lenghTwo; j++) {
temp = oneInt[i] * twoInt[j];
sumInt[i + j] += temp;
k = i + j;
while (sumInt[k] >= 10) {
sumInt[k + 1] += (sumInt[k] / 10);
sumInt[k] %= 10;
k++;
}
}
int flag = 0;
for (i = 199; i >= 0; i--) {
if (sumInt[i] != 0 || flag == 1) {
sb.append(String.valueOf(sumInt[i]));
flag = 1;
}
}
System.out.printf(sb.toString());
}
}
3、输入互不相同的字符串长度为n,如abc,并输入数字m,如2,然后对其进行m个字符有序的输出,如ab ac bc
java源码为:
import java.util.Scanner;
public class Main3 {
//求组合数 C(m,n)
public static int C(int m,int n){
int c=1;
int k=1;
for (int i=1;i<=m;i++){
c=c*(n+1-i);
k=k*i;
}
return (c/k);
}
//获取str中所有长度为m的子串
public static String[] getSubString(String str,int m){
String[] s=new String[]{};//保存子串
int count=0;//子串数目
int n=str.length();//原字符串长度
if (m>n || m<=0)
return s;//如果子串长度大于字符串长度,则不会有满足要求的子串
else
s=new String[C(m,n)];//保存子串
int[] k=new int[m];
for (int i=0;i<m;i++){
k[i]=i;
}
int p=m-1;
int end=0;
while (end==0){
//保存当前得到的子串
count++;
String temps="";
for (int i=0;i<m;i++)
temps+=str.charAt(k[i]);
s[count-1]=temps;
//获取下一个子串
k[p]=k[p]+1;
while (p>=0 && k[p]-p>n-m){
p=p-1;
if (p>=0)
k[p]=k[p]+1;
}
if (p>=0){
for (int i=p+1;i<m;i++)
k[i]=k[p]+i-p;
p=m-1;
}else{
end=1;
}
}
return s;
}
public static void main(String args[]) {
StringBuffer sb = new StringBuffer();
Scanner sc = new Scanner(System.in);
String str = sc.next();
int m = sc.nextInt();
if (m==0||m>str.length()) {
System.out.println("ERROR");
}else{
String[] ss=getSubString(str,m);
for(String s : ss)
sb.append(s+" ");
System.out.println(sb.toString());
}
}
}
以上均为自己原创代码,如果有不对的地方希望大家能指正!
就是输入字符串,过滤掉其他的字符,只对字母进行重复次数的计算。
java源码为
import java.util.Scanner;
import java.util.regex.PatternSyntaxException;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
if (input.length()>1024) {
}else{
String in = filter(input);
String output = compressStringBetter(in);
System.out.printf(output);
}
}
public static String filter(String input){
StringBuffer sb = new StringBuffer();
for (int j = 0; j < input.length(); j++) {
if (input.charAt(j)>='A'&&input.charAt(j)<='Z') {
sb.append(input.charAt(j));
}
}
return sb.toString();
}
public static String compressStringBetter(String str) {
int size = countCompression(str);
if (size >= str.length()) {
return str;
}
StringBuffer sb = new StringBuffer();
char last = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i)>='A'&&str.charAt(i)<='Z') {
}
if (str.charAt(i) == last) {// 找到重复字符
count++;
} else {
sb.append(last);
sb.append(count);
last = str.charAt(i);
count = 1;
}
}
sb.append(last);
sb.append(count);
return sb.toString();// 前面的+最后一组处理
}
public static int countCompression(String in) {
if (in == null || in.isEmpty()) {
return 0;
}
int size = 0;
char last = in.charAt(0);
int count = 1;
for (int i = 1; i < in.length(); i++) {
if (in.charAt(i) == last) {// 找到重复字符
count++;
} else {
last = in.charAt(i);
size += 1 + String.valueOf(count).length();
count = 1;
}
}
size += 1 + String.valueOf(count).length(); // 处理最后一组
return size;
}
}
2、输入两个大整数,求出两者的乘积,如1234567*123 = 151851741.
java源码为:
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input1 = sc.next();
String input2 = sc.next();
StringBuffer sb = new StringBuffer();
char[] oneCh = input1.toCharArray();
char[] twoCH = input2.toCharArray();
int[] oneInt = new int[200];
int[] twoInt = new int[200];
int[] sumInt = new int[200];
int lenghOne = input1.length();
int lenghTwo = input2.length();
int i;
for (i = lenghOne - 1; i >= 0; i--) {
oneInt[lenghOne - 1 - i] = oneCh[i] - '0';
}
for (i = lenghTwo - 1; i >= 0; i--) {
twoInt[lenghTwo - 1 - i] = twoCH[i] - '0';
}
int temp, k, j;
for (i = 0; i < lenghOne; i++)
for (j = 0; j < lenghTwo; j++) {
temp = oneInt[i] * twoInt[j];
sumInt[i + j] += temp;
k = i + j;
while (sumInt[k] >= 10) {
sumInt[k + 1] += (sumInt[k] / 10);
sumInt[k] %= 10;
k++;
}
}
int flag = 0;
for (i = 199; i >= 0; i--) {
if (sumInt[i] != 0 || flag == 1) {
sb.append(String.valueOf(sumInt[i]));
flag = 1;
}
}
System.out.printf(sb.toString());
}
}
3、输入互不相同的字符串长度为n,如abc,并输入数字m,如2,然后对其进行m个字符有序的输出,如ab ac bc
java源码为:
import java.util.Scanner;
public class Main3 {
//求组合数 C(m,n)
public static int C(int m,int n){
int c=1;
int k=1;
for (int i=1;i<=m;i++){
c=c*(n+1-i);
k=k*i;
}
return (c/k);
}
//获取str中所有长度为m的子串
public static String[] getSubString(String str,int m){
String[] s=new String[]{};//保存子串
int count=0;//子串数目
int n=str.length();//原字符串长度
if (m>n || m<=0)
return s;//如果子串长度大于字符串长度,则不会有满足要求的子串
else
s=new String[C(m,n)];//保存子串
int[] k=new int[m];
for (int i=0;i<m;i++){
k[i]=i;
}
int p=m-1;
int end=0;
while (end==0){
//保存当前得到的子串
count++;
String temps="";
for (int i=0;i<m;i++)
temps+=str.charAt(k[i]);
s[count-1]=temps;
//获取下一个子串
k[p]=k[p]+1;
while (p>=0 && k[p]-p>n-m){
p=p-1;
if (p>=0)
k[p]=k[p]+1;
}
if (p>=0){
for (int i=p+1;i<m;i++)
k[i]=k[p]+i-p;
p=m-1;
}else{
end=1;
}
}
return s;
}
public static void main(String args[]) {
StringBuffer sb = new StringBuffer();
Scanner sc = new Scanner(System.in);
String str = sc.next();
int m = sc.nextInt();
if (m==0||m>str.length()) {
System.out.println("ERROR");
}else{
String[] ss=getSubString(str,m);
for(String s : ss)
sb.append(s+" ");
System.out.println(sb.toString());
}
}
}
以上均为自己原创代码,如果有不对的地方希望大家能指正!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 从源码安装Mysql/Percona 5.5
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树