首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

根本算法题目汇总(不断追加中.)

2012-10-13 
基本算法题目汇总(不断追加中..)1.一道简单16进制加密算法/** * 简单加密解密算法 * 任意十六进制字符asci

基本算法题目汇总(不断追加中..)
1.一道简单16进制加密算法

/** * 简单加密解密算法 * 任意十六进制字符ascii转换,转换规则: * 当前index位置的数加上index,如果结果超出F则从0重新开始循环 * 比如: "3A4E"应该被转换为"3B61" *   3在0位置,所以保持不变, *   A在1位置,转化为B, *   4在2位置,转化为6, *   E在3位置,转化为1, * 然后倒转字符,比如"3B61"转换为"16B3" */public class Encryption {public static void main(String[] args) {System.out.println(Decrypt2(encrypt2("3A4E46ABAE829")));          System.out.println(encrypt2("3A4E"));          System.out.println(Decrypt2("16B3"));}//encrypt 加密public static String encrypt2(String hexStr){String template = "0123456789ABCDEF";int len = hexStr.length();char[] result = new char[len];int index = 0;int ch = 0;for(int i=0;i<len;i++){ch = hexStr.charAt(i);index = (i + template.indexOf(ch))%16;result[i] = template.charAt(index);}result = reverse(result);return new String(result);}//Decrypt 解密public static String Decrypt2(String hexStr){String template = "FEDCBA9876543210";char[] argStr = hexStr.toCharArray();argStr = reverse(argStr);char[] result = new char[argStr.length];int index = 0;for(int i=0;i<argStr.length;i++){index = (i + template.indexOf(argStr[i]))%16;result[i] = template.charAt(index);}return new String(result);}//reverse the char arraypublic static char[] reverse(char[] chs){char temp;for(int i=0;i<chs.length/2;i++){temp = chs[i];chs[i] = chs[chs.length-1-i];chs[chs.length-1-i] = temp;}return chs;}}



2.上机试题三则
public class HaweiQuestion {public static void main(String[] args) {HaweiQuestion q = new HaweiQuestion();int[] input = {3, 6, 1, 9, 7, 8}; int[] output = new int[input.length];q.sort(input, input.length, output);for(int i=0;i<input.length;i++){System.out.print(output[i]+" ");}System.out.println();int[] task = {0, 30, 155, 1, 80, 300, 170, 40, 99};int[] system_task = new int[task.length];int[] user_task = new int[task.length];q.scheduler(task, task.length, system_task, user_task);}/** * 选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数, * judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委, * judge_type[i] == 2,表示大众评委,n表示评委总数。 * 打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整), * 然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委, * 则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。 */public int cal_score(int score[], int judge_type[], int n)  {int proNum=0;int peoNum=0;int total=0;int peoCount=0;for(int i=0;i<n;i++){if(judge_type[i]==1){proNum += score[i];}else{peoNum += score[i];peoCount++;}}if(peoCount!=0)total = (int)(proNum * 0.6 + peoNum * 0.4);elsetotal = proNum / n ;return total;}/** * 给定一个数组input[] ,如果数组长度n为奇数, * 则将数组中最大的元素放到 output[] 数组最中间的位置, * 如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上, * 然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。     * 例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1};      * input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3} */ public void sort(int input[], int n, int output[]){ //首先按从大到小的顺序排列input for(int i=0; i < n;i++){ for(int j = i;j > 0;j--){ if(input[j] > input[j-1]){//大数上浮 swap(input,j,j-1); } } }int count = 0;for (int i = n / 2, j = n / 2; i >= 0 && j < n; i--, j++) {if (i == j) {output[i] = input[count++];} else {output[i] = input[count++];output[j] = input[count++];}}if(n%2 == 0){//偶数还有一个值output[0] = input[count];}  }private void swap(int[] input, int j, int i) {int temp = input[j];input[j] = input[j-1];input[j-1] = temp;}/** * 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。 * 其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。 * 优先级大于255的为非法任务,应予以剔除。 * 现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。 * 函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[]数组和  * user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标), * 并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面), * 数组元素为-1表示结束。     * 例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}      * system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1} */public void scheduler(int task[], int n, int system_task[], int user_task[]){int[] indexs = new int[n];//用来保存下标for(int i=0;i<n;i++){//初始化indexs[i] = i ;}//按从小到大的顺序排列task for(int i=0; i < n;i++){ for(int j = i;j > 0;j--){ if(task[j] < task[j-1]){//小数上浮,相等不交换 swap(task,j,j-1); swap(indexs,j,j-1);//同时交换下标 } } } int sysPoint = 0; int userPoint = 0; for(int i=0;i<n;i++){ if(task[i] < 50){ system_task[sysPoint++] = indexs[i]; }else if(task[i]<=255){ user_task[userPoint++] = indexs[i]; }else{ //do nothing } }}}



3.将1-9组成三个特殊三位数
/* *  将1-9九个数字组合成三个三位数。 *  要求1-9每个数字只使用一次,且第二个数是第一个数的两倍,第三个数是第一个数的三倍。 *  符合条件的数有几组?将他们打印出来。 * */public class FindGroup {public static void main(String[] args) {int maxNumber = 987/3;   //不重复最大数为987int count = 0;for(int i=123;i<maxNumber;i++){if(isRepeat(i+""+i*2+""+i*3)){   //无重复count++;System.out.println(i+" "+i*2+" "+i*3);}}}public static boolean isRepeat(String str){       //判断是否有重复数字char[] chs = str.toCharArray();String reserve = "";for(int i=0;i<chs.length;i++){if(reserve.indexOf(chs[i])==-1){reserve+=chs[i];}}return chs.length==reserve.length()?true:false;}}



4.超大数相加
public class AddBigNumber {public static void main(String[] args) {String data1 = "123456";        String data2 = "22";        String result = add(data1,data2);        System.out.println(result);}public static String add(String data1, String data2) {int store = 0;int len1 = data1.length();int len2 = data2.length();StringBuffer sb = new StringBuffer();for(int i=0;i<(len1>len2?len1:len2);i++){int d1 = getLowerNumber(i,data1);int d2 = getLowerNumber(i,data2);int sum = d1 + d2 + store;store = sum/10;       //有进位就存下来sb.append(sum%10);}if(store!=0)sb.append(store);     //考虑最高位进位return sb.reverse().toString();}public static int getLowerNumber(int i,String str){if(i>=str.length())return 0;String s = str.charAt(str.length()-1-i)+"";return Integer.parseInt(s);}}



5.求喝饮料数与求日期
package com.algorithm;/** * @author  * http://topic.csdn.net/u/20111012/20/1c402221-028c-4920-b2fc-0b63b839d256.html?38410 */public class BottleDay {/** * 20块钱,1块钱1瓶,两个空瓶子可以换一瓶,问最多可以喝几瓶? */public static void maxDrink(){int sum = 20;int bottle = sum;while (bottle > 1) {System.out.println(bottle+" "+bottle/2);    sum += bottle/2;    bottle = bottle%2 + bottle/2;}System.out.println(sum);}/** * 有一名员工发现日历已经7天没有翻了, * 于是他连着翻了7页,7天的总和刚好是138,问这一天是几号? */public static void getSpecialDay() {int[] end = { 28, 29, 30, 31 };//可能的月末最後一天int days = 138;int count = 0;int day; int max;boolean found = false;//标志位for (int i = 0; i < end.length; i++) {max = end[i] + 7;//7号day = 1;while (max > 0) {count = 0;for (int j = day; j < day + 7; j++) {if (j > end[i]) {count += j % end[i];} else {count += j;}}if (count == days) {found = true;for (int j = day; j < day + 7; j++) {System.out.printf("%d, ", j > end[i] ? j % end[i] : j);}break;}day++;max--;}if (found) {System.out.printf("------end=%d\n", end[i]);break;}}if (!found) {System.out.println("error");}}public static void main(String[] args) {maxDrink();System.out.println("--------");getSpecialDay();}}


6.正则表达式按要求切割代码
文件名:test.txt,这是要切割的代码
#include<iostream>int main(){    int c[20];    int a=5;    int b=a+12;    for(int i=0;i<=10;i++)    {        c[i]=i;      }    return 0;}

算法如下
package com.algorithm;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * author:yunan */public class SpiltCode {//你要保留的连续的字符private String[] codes = {"==","++","--",">=","+=","<="};  //等等..ArrayList<String> saveTable = new ArrayList<String>();//保存所有切割出来的串public static void main(String[] args) {new SpiltCode().spiltCode();}private BufferedReader getBuffreader(String path){File file = new File(path);FileInputStream in;BufferedReader reader=null;try {in = new FileInputStream(file);    reader = new BufferedReader(new InputStreamReader(in));} catch (Exception e) { e.printStackTrace();}return reader;}public  void spiltCode(){BufferedReader reader = getBuffreader("test.txt");String regex = "\\w+|\\p{Punct}";//这个可以把单词和一个一个特殊字符全切出来Pattern p = Pattern.compile(regex);Matcher m = null;String line = null;String pre = "";//上一个匹配的串int index = 0;try {while((line=reader.readLine())!=null){m = p.matcher(line);while(m.find()){String chars = m.group();if(isInCodes(pre+chars)){ saveTable.set(--index, pre+chars);}else{ saveTable.add(chars);}pre = chars;index++;}}} catch (IOException e) {e.printStackTrace();}printTable();//打印}private boolean isInCodes(String code){for(int i=0;i<codes.length;i++){if(codes[i].equals(code)){return true;}}return false;}private void printTable(){for(String sav:saveTable){System.out.println(sav);}}}结果如下:
#include<iostream>intmain(){intc[20];inta=5;intb=a+12;for(inti=0;i<=10;i++){c[i]=i;}return0;}




7.超大数相乘的两种方法
//方法一public static void testMul()  {String p1 = "123456789012345678901234123456789012345678901234";// "123456789012345678901234";String p2 = "987654321098765432109876543210987654123456789012345678901234";// "987654321098765432109876543210987654";int ASCII = 48;char[] result = new char[p1.length() + p2.length()];for (int i = 0; i < result.length; i++) {result[i] = '0';}char ctemp = ' ';char[] pc1 = p1.toCharArray();for (int i = 0; i < pc1.length / 2; i++) {//交换位置,如45689变98654ctemp = pc1[i];pc1[i] = pc1[pc1.length - 1 - i];pc1[pc1.length - 1 - i] = ctemp;}char[] pc2 = p2.toCharArray();for (int i = 0; i < pc2.length / 2; i++) {ctemp = pc2[i];pc2[i] = pc2[pc2.length - 1 - i];pc2[pc2.length - 1 - i] = ctemp;}int temp = 0;// 临时结果int step = 0;// 进位int time = 0;// 次数int bit = 0;// 位数for (char c1 : pc1) {//021time = bit;for (char c2 : pc2) {//654temp = (c1 - ASCII) * (c2 - ASCII);//0temp = temp + result[time] - ASCII;//0if (temp > 9) {// 进位int i = 0;do {result[time + i] = (char) (temp % 10 + ASCII);step = (temp - temp % 10) / 10;i++;temp = result[time + i] - ASCII + step;} while (temp > 9);result[time + i] = (char) (temp + ASCII);} else {result[time] = (char) (temp + ASCII); //result[0] = '0'}time++;}bit++;}System.out.println("##############################");System.out.print(p1 + " x " + p2 + " = ");for (int i = result.length - 1; i >= 0; i--) {System.out.print(result[i]);}System.out.println();System.out.println("##############################");}//方法二public static void bigNumberMulti(){String num1 = "123456789012345678901234123456789012345678901234";String num2 = "987654321098765432109876543210987654123456789012345678901234";char[] cp1 = num1.toCharArray();char[] cp2 = num2.toCharArray();char[] result = new char[cp1.length+cp2.length];   //用于存储每位的值//矩阵存储计算的值int sum = cp1.length+cp2.length;//竖排总数char[][] caculate = new char[cp1.length][sum];  for(int i=0;i<caculate.length;i++){for(int j=0;j<caculate[0].length;j++){caculate[i][j] = ' ';}}int bit = 0;   //位数int level = 0;  //层数int temp = 0;  //临时存储的数据int ASIIC0 = 48;  //0的asiic码值int carry = 0; //进位for(int i=cp1.length-1;i>=0;i--){//9bit = sum-1;for(int j=cp2.length-1;j>=0;j--){//6temp = (cp1[i]- ASIIC0) * (cp2[j]-ASIIC0) + carry;carry = 0;if(temp>9){carry = temp / 10;temp = temp % 10 ;}caculate[level][bit--] = (char) (temp + ASIIC0);}//如果最后一位还有进位if(carry>0){caculate[level][bit] =  (char)(carry + ASIIC0);carry=0;}sum--;level++;}int carry2 = 0;for(int y=caculate[0].length-1;y>=0;y--){int value = 0;for(int x=0;x<caculate.length;x++){if(caculate[x][y]>='0' && caculate[x][y]<='9'){value += caculate[x][y] - ASIIC0;}}value += carry2;carry2 = 0;if(value>9){carry2 = value / 10;value = value % 10;}result[y] = (char)(value + ASIIC0);}System.out.println(result);System.out.println("====================用于显示=======================");for(int i=0;i<caculate.length;i++){for(int j=0;j<caculate[0].length;j++){System.out.print(caculate[i][j]+" ");}System.out.println();}for(int i=0;i<caculate[0].length;i++){System.out.print("--");}System.out.println();for(char re:result){System.out.print(re+" ");}}

热点排行