java机试题---2021(算法)

1.功能描述:数组的循环移位,

  输入:{a,b,c},2

  输出:{b,c,a}

public static void main(String[] args) {
        String[] sArr = getChildren(new String[] { "a", "b", "c", "A", "B", "C", "D", "E" }, 5);
        for (String s : sArr) {
            System.out.println(s);
        }
    }
    public static String[] getChildren(String[] data, int index) {
        for (int i = 0; i < index; i++) {
            int j = data.length - 1;
            String loay = data[j];
            for (j = data.length - 1; j > 0; j--) {
                data[j] = data[j - 1];
            }
            data[0] = loay;
        }
        return data;
    }

2.输入一个字符,将字符转换为小写,将其对应的ASCII值加5后,输出结果。

   程序要求:若其值加5后的字符值大于'z',将其转换成从a开始的字符。

   输入:‘A’

   输出:‘f’

    public static void main(String[] args) {
        String loay = "z";
        int c = loay.charAt(0);
        int num = c + 5;
        if (num > 'Z') {
            int a = 'a';
            int z = 'z';
            System.out.println((char) Character.toLowerCase(num + a - z - 1));
        } else {
            System.out.println((char) Character.toLowerCase(num));
        }
       }

3. 功能描述:查找一个字符串的子字符串集

    输入:abab

    输出:a b ab ba aba bab

public static void main(String[] args) {
        System.out.println(getChildren("ababc"));
    }
    public static List<String> getChildren(String data) {
        Set<String> set = new TreeSet<String>();
        for (int i = 1; i < data.length(); i++) {
            for (int j = 0; j < data.length(); j++) {
                if (j + i <= data.length()) {
                    set.add(data.substring(j, j + i));
                }
            }
        }
        List<String> list = new ArrayList<String>();
        list.addAll(set);
        return list;
    }

4.功能描述:判断一个字符串中的"( )"是否配对

   输入:if(a.equals(a))

   输出:true

public static void main(String[] args) {
        Boolean bool = isBool("if()(a.equals(a)))");
        System.out.println(bool);
    }
    public static Boolean isBool(String data) { 
        String[] split =data.split("");
        List<String> l = new ArrayList<String>();
        for (int i = 0; i < split.length; i++) {
            l.add(split[i]);
        }
        for (int i = 0; i < l.size(); i++) {
            if (l.get(i).equals("(") || l.get(i).equals(")")) {
            } else {
                l.remove(i);
                i--;
            }
        }
        String k = l.get(0);
        for (int i = 0; i < l.size(); i++) {
            if (k.equals("(") && l.get(i).equals(")")) {
                l.remove(i);
                l.remove(0);
                i = 0;
            }
        }
        if (l.size() == 0) {
            return true;
        }
        return false;
    }

5.删除一个字符串里出现次数最多的子字符串,如果有多个出现次数相同的并且出现次数最多则将多个全部删除

比如abbccd

得到结果 ad

    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();
        loay("abcceedwe", m);
    }
    public static String loay(String coay, Map<String, Integer> m) {
        String[] apl = coay.split("");
        List<String> l = new ArrayList<>();
        for (int i = 0; i < apl.length; i++) {
            l.add(apl[i]);
            if (m.get(apl[i]) == null) {
                m.put(apl[i], 0);
            }
            if (m.get(apl[i]) != null) {
                m.put(apl[i], (m.get(apl[i]) + 1));
            }
        }
        Integer is = Integer.MIN_VALUE;
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, Integer> it : m.entrySet()) {
            if (it.getValue() > is) {
                is = it.getValue();
            }
        }
        for (Map.Entry<String, Integer> it : m.entrySet()) {
            if (it.getValue().equals(is)) {
                sb.append(it.getKey());
            }
        }
        java.lang.String[] a = sb.toString().split("");
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
            for (int j = l.size() - 1; j > 0; j--) {
                if (a[i].equals(l.get(j))) {
                    l.remove(j);
                }
            }
        }
        System.out.println(l);
        return l.toString();
    }

6.手动输入一个存储整数的数组,要求输出数组里面的2个最大值

public static void main(String[] args) {
        int len = 4;
        int[] ary = new int[len];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < ary.length; i++) {
            System.out.print("请输入数组第"+(i+1)+"个整数:");
            ary[i] = sc.nextInt();
        }
        System.out.println("控制台写入的值" + Arrays.toString(ary));
        for (int j = 0; j < ary.length - 1; j++) {
            for (int k = j + 1; k > 0; k--) {
                if (ary[k] > ary[k - 1]) {
                    int temp = ary[k - 1];
                    ary[k - 1] = ary[k];
                    ary[k] = temp;
                }
            }
        }
        System.out.println("两个最大值为" + ary[0] + "*" + ary[1]);
    }

7.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

public static void main(String args[]){
		int i=0;
		for(i=1;i<=20;i++)
			System.out.println(number(i));
	}
	public static int number(int x)
	{
		if(x==1 || x==2)
			return 1;
		else
			return number(x-1)+number(x-2);
	}

8.判断101-200之间有多少个素数,并输出所有素数。

程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,

则表明此数不是素数,反之是素数。


    public static void main(String[] args) {
        List<Integer> kk = new ArrayList<>();
        for (int i = 1;i<100;i++) {
            boolean prime = isPrime(i);
            if (!prime){
                kk.add(i);
            }
        }
        System.out.println(kk);
    }


    private static boolean isPrime(int i) {
        boolean bol = false;
        if (i == 1) {
            return true;
        }

        for (int j = 2; j <= i/2; j++) {
            if (i % j == 0) {
                bol = true;
                break;
            }
        }
        return bol;
    }

9.打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

    public static void main(String[] args) {
        List<Integer> kk = new ArrayList<>();
        for (int i = 100;i<1000;i++) {
            boolean narcissistic = isNarcissistic(i);
            if (narcissistic){
                kk.add(i);
            }
        }
        System.out.println(kk);
    }

    private static boolean isNarcissistic(int num) {
        /*String s = String.valueOf(num);
        int number =0 ;
        for (int k = 0;k<s.length();k++) {
            int c = s.charAt(k) - '0'; // char转int方式
            number = number + c*c*c;
        }

        if (number == num){
            return true;
        }*/

        // 或者
        int i=0,j=0,k=0;
        i=num / 100;
        j=(num % 100) /10;
        k=num % 10;

        if(num==i*i*i+j*j*j+k*k*k){
            return true;
        }
        return false;
    }

10.将一个正整数分解质因数。例如:输入100,打印出90=2*2*5*5。

    public static void main(String[] args) {
        int number = 100;
        // 分解质因数 2*2*5*5
        String primeJoin = "";
        getPrimeJoin(number);
    }

        private static void getPrimeJoin(Integer number) {
        for (int k = 2; k <= number; k++) {
            if (number % k == 0) {
                System.out.print(k + "*");
                getPrimeJoin(number / k);
            }
        }
        System.exit(0);
    }

11.一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。

    public static void main(String[] args) {
        List<Integer> kk = new ArrayList<>();
        for (int i = 6; i < 100000; i++) {
            boolean bol = isPerfectNumber(i);
            if (bol){
                kk.add(i);
            }
        }
        System.out.println(kk);
    }

    private static boolean isPerfectNumber(int i) {
        int number = 0;
        for (int k = 1;k<=i/2;k++) {
            if (i%k == 0){
                number = number + k;
            }
        }
        if (i == number){
            return true;
        }
        return false;
    }

12.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

   /**
     * 求经过和反弹
     *
     * @param x
     * @param y
     */
    public static void getData(int x, int y) {
        // 经过
        double r = 0;
        // 反弹
        double t = x;
        for (int i = 1; i <= y; i++) {
            if (i == 1) {
                r = x;
            } else {
                r += (t * 2);
            }
            t = t / 2;
        }

        System.out.println("经过:" + r);
        System.out.println("反弹:" + t);
    }

13:力扣:给出一个整数数组和一个目标值,请你找出数组中两数之和等于目标值的两个整数和下标.

    /**
     * 获取目标值
     *
     * @param array
     * @param targetNumber
     */
    public static void getSubscriptCountNumber(int[] array, int targetNumber) {
        int oneNumber = 0;
        int twoNumber = 0;
        int oneSubscript = 0;
        int twoSubscript = 0;
        boolean bol = false;
        for (int i = 0; i < array.length; i++) {
            if (bol) {
                break;
            }
            if (array[i] >= targetNumber) {
                continue;
            }
            for (int j = 0; j < array.length; j++) {
                if (array[j] >= targetNumber) {
                    continue;
                }
                if ((array[i] + array[j]) == targetNumber) {
                    oneNumber = array[i];
                    twoNumber = array[j];
                    oneSubscript = i;
                    twoSubscript = j;
                    bol = true;
                    break;
                }
            }
        }
        if (!bol) {
            System.out.println("无符合条件的值!");
        } else {
            System.out.println("第一个下标:" + oneSubscript + ",值:" + oneNumber);
            System.out.println("第二个下标:" + twoSubscript + ",值:" + twoNumber);
        }
    }

14.力扣:给你一个有序数组,请你在原数组上删除重复出现的元素,让数组中不存在相同的元素,返回数组的长度

   public static void main(String[] args) {
        int[] array = {1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8};
        // getNum(array);
        // 自己写  java:定义数组的长度无法减少 只能使用替换
        int count = 0;
        for (int i = 0; i < array.length - count; i++) {
            if (i != 0) {
                if (array[i] == array[i - 1]) {
                    count++;
                    for (int j = i; j < array.length - count; j++) {
                        array[j] = array[j + 1];
                    }
                }
            }
        }
        System.out.println(array.length - count);
    }

    /**
     * 二叉树 百度
     * @param array
     * @return
     */
    public static int getNum(int[] array) {
        int x = 1;
        int y = 1;
        if (array.length <= 0) {
            return 0;
        }
        while (y < array.length) {
            if (array[y] != array[y - 1]) {
                array[x] = array[y];    //当出现了一个新的元素时,就放入num[slow]处
                x++;
            }
            y++;
        }
        return x;
    }

15.力扣:给你一个数组 nums 和一个值 val,你需要在原数组中移除所有数值等于val的元素,并返回移除后数组的新长度。

    public static int getArrayNumberSize(int[] array, int number) {
        int x = 0;
        int y = 0;
        while (array.length >= y) {
            if (number != array[y]) {
                array[x] = array[y];
                x++;
            }
            y++;
        }
        return x;
    }

16.力扣:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    public static int getArrayTargetNumber(int[] array, int number) {
        int subscriptNumber = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == number) {
                subscriptNumber = i + 1;
                break;
            } else {
                if (array[i] < number && array[i + 1] > number) {
                    subscriptNumber = i + 1;
                }
            }
        }
        return subscriptNumber;
    }

17.力扣:给定一个数组arrays,数组中的元素有正数也有负数,数组中的一个或连续多个数组成一个子数组。求这些所有子数组的最大和

    public static void getMaxArray(int[] arrays) {
        int upMaxNumber = arrays[0];
        int thisMaxNumber = arrays[0];
        for (int i = 1; i < arrays.length; i++) {
            if (arrays[i] > upMaxNumber) {
                upMaxNumber = arrays[i];
            } else {
                upMaxNumber += arrays[i];
            }
            if (thisMaxNumber < upMaxNumber) {
                thisMaxNumber = upMaxNumber;
            }
        }
        System.out.println(thisMaxNumber);
    }

18.力扣:给定一个字符串,找出没有重复字符的最长子字符串的长度。

    /**
     * 下标寻找
     *
     * @param str
     * @return
     */
    public static void getMaxLength(String str) {
        int j = 0, n = 0, thisLength = 0, maxLength = 0;
        for (int i = 0; i < str.length(); i++) {
            boolean bol = false;
            for (int k = j; k < i; k++) {
                if (str.charAt(i) == str.charAt(k)) {
                    i = k + 1; // 重新让数组循环
                    bol = true;
                    break;
                }
            }
            if (bol) {
                thisLength = 1;
                maxLength = 0;
            } else {
                thisLength++;
            }

            if (bol && maxLength < thisLength) {
                j = i;
            }

            if (maxLength < thisLength) {
                n = i;
                maxLength = thisLength;
            }
        }
        System.out.println(str.substring(j, n + 1));
        System.out.println(maxLength);
    }

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0003.Longest-Substring-Without-Repeating-Characters/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值