一 、基本数据类型

1.A+B问题

public class Solution {
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
        return a+b;
    }
}

2.反转一个三位整数

 public int reverseInteger(int number) {
        if(number>=100 && number<1000){
            int a = number%10;
            int b = number/10%10;
            int c = number/100%10;
            return a*100+b*10+c;
        }
        return -1;
    }

3.计算圆周长和面积

public double[] calculate(int r) {
        double[] a = new double[2];
        a[0] = 2 * 3.14 * r;
        a[1] = 3.14 * r * r;
        return a;
    }

4.巴什博弈

public boolean canWinBash(int n) {
        // Write your code here
        
        return n%4!=0;
    }

1+3=4;只要最后对方拿时,剩余石头数是4,则我方必赢,因为无论对方拿几,我方都能一次拿完;
题目变为:n能不能变为4,由此发现只要我们首次取n%4个石头,对方就会从4的倍数开始取(因为我们取走了余数,剩余一定被4整除),那么接下来,无论对方取几(1,2,3都不大于4),我们总能让对方一直处于4的倍数状态,直到获胜,
因此题目最终变为:n能否被4整除;如不能则我方获胜,如果能则我方失败;

二、判断语句

5.判断数字与字母字符

public boolean isAlphanumeric(char c) {
        // write your code here
        // return Character.isLetter(c) || Character.isDigit(c);
        return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')|| (c >= 'a' && c <= 'z');
    }

6.闰年

public boolean isLeapYear(int n) {
        return (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0));
    }

7.大小写转换


解题思路

ASCII编码表中,A=65,a=97,以此类推,每个小写字母与大写字母间隔32,所以小写字母转大写字母,直接小写字母-32就ok,大写字母转小写字母的话就+32,毕竟人家表上写的好好的,对照着用呗。

public char lowercaseToUppercase(char character) {
        // write your code here
        return character -= 32;
    }

8.月份天数

public int getTheMonthDays(int year, int month) {
        int[] day = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (month == 2) {
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                return 29;
            }
        }
        return day[month];
    }

9.简单计算器

 public int calculate(int a, char operator, int b) {
        // write your code here
         switch (operator) {
            case '*':
                return a * b;
            case '/':
                return a / b;
            case '-':
                return a - b;
            default:
                return a + b;
        }
    }

10.三数之中的最大值

public int maxOfThreeNumbers(int num1, int num2, int num3) {
        // write your code here
        int a=num1>num2?num1:num2;//a为num1henum2中最大值
        return a>num3?a:num3;
    }

三、数组和循环

11.打印X


public List<String> printX(int n) {     
        ArrayList<String> res=new ArrayList<>();//创建一个存放String类型属性的ArrayList,名称为res
        char[] line=new char[n];//创建一个长度为n的字符型数组line
        for(int i=0;i<n;i++){//外循环遍历正整数n的次数
            for(int j=0;j<n;j++){//该循环为了辅助初始化字符型数组中的每个属性
                line[j]=' ';//初始化字符型数组中的每个属性
            }
            line[i]='X';//左边对应位置赋值"X“
            line[n-i-1]='X';//右边对应位置赋值“X”
            res.add(String.valueOf(line));//将得到的line转换成字符串的形式增加到ArrayList
        }
        return res;//返回ArrayList
    }

12.数组的最大值

public float maxOfArray(float[] A) {
        // write your code here
        float max = A[0];
        for(int i = 0;i < A.length;i++){
            if(max < A[i]){
                max = A[i];
            }
        }
        return max;
    }

13.生成给定大小的数组

public List<Integer> generate(int size) {
        // write your code here
        List<Integer> list = new ArrayList<>(size);
        for(int i = 0;i < size;i++){
            list.add(i+1);
        }
        return list;
    }

14.移动零

算法:双指针
算法思路

使用两个指针right和left,left为新数组的指针,right为原数组的指针,原数组指针向后扫,遇到非0的数就赋值给新数组的指针位置,并将新数组指针向后移动

代码思路

将两个指针先指向0,即数组头部

right向后扫描,当遇到非0数即nums[right] != 0时,将其赋值给新数组指针指向的位置,即nums[left] = nums[right],并将left向后移动一位

若新数组指针还未指向尾部,即剩余的位置都是0,将剩余数组赋值为0

复杂度分析

N表示数组nums长度

空间复杂度:O(1)

时间复杂度:O(N)

public void moveZeroes(int[] nums) {
        //将两个指针先指向数组头部
        int left = 0, right = 0;
        while (right < nums.length) {
            // 遇到非0数赋值给新数组指针指向的位置
            if (nums[right] != 0) {
                nums[left] = nums[right];
                // 将left向后移动一位
                left++;
            }
            right++;
        }

        // 若新数组指针还未指向尾部,将剩余数组赋值为0
        while (left < nums.length) {
            nums[left] = 0;
            left++;
        }
    }

15.寻找最大值

public int maxNum(List<Integer> nums) {
        // write your code here
        int max = nums.get(0);
        for(int num : nums){
            if(num > max){
                max = num;
            }
        }
        return max;
    }

16.交换数组两个元素

public void swapIntegers(int[] A, int index1, int index2) {
        // write your code here
        if(!(A.length > 0 )|| A[index1] == A[index2]){return;}
        int temp = A[index1];
        A[index1] = A[index2];
        A[index2] = temp;
    }

17.Fizz buzz问题

public List<String> fizzBuzz(int n) {
        List<String> res = new LinkedList<>();
        for (int i = 1; i <= n; i++) {
            String w = help(i, 3, "fizz") +help(i,15," ") +  help(i, 5, "buzz");
            if (w.equals("")) {
                w += i;
            }
            res.add(w);
        }
        return res;
    }
    
    public String help(int n, int div, String w) {
        return n % div == 0 ? w : "";
    }

18.冰雹猜想

public int getAnswer(int num) {
        // write your code here.
        int count = 0;
        while(num > 1){
            if(num %2 ==0){
                num /=2;
                count++;
            }else{
                num = 3*num+1;
                count++;
            }
        }
        return count;
    }

19.加一

public int[] plusOne(int[] digits) {
        // write your code here
        int i= digits.length-1;
        digits[i]+=1;
        while(digits[i]==10&&i>0){
            digits[i]=0;          
            digits[--i]+=1;          
        }
        if(digits[0]==10){
           digits = new int[digits.length+1];
           digits[0]=1;
        }
        return digits;
    }

20.回文数 ||


第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串,比较简单

public boolean isPalindrome(int n) {
        // Write your code here
        //使用字符串
        String res = Integer.toBinaryString(n);
        char [] chars = res.toCharArray();
        for(int i = 0;i < chars.length/2;i++){
            if(chars[i] != chars[chars.length-i-1]){
                return false;
            }
        }
        return true;
    }

21.整数排序


使用冒泡排序

public void sortIntegers(int[] A) {
        // write your code here
        for(int i =0;i < A.length-1;i++){
            for(int j = 0;j < A.length-i-1;j++){
                int temp = 0;
                if(A[j] > A[j+1]){
                    temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                }
            }
        }

22.寻找素数

public List<Integer> prime(int n) {
        // write your code here
        List<Integer> list = new ArrayList<>();
        boolean loop = true;
        for(int i = 2;i <= n;i++){
            loop = true;
            for(int j = 2;j < 10;j++){
                if(i!=j){
                    if(i%j==0){
                    loop = false;
                    break;
                    }
                }else{
                    continue;
                }
            }
            if(loop == true){
                list.add(i);
            }
        }
        return list;
    }

23.数组第二大数

public int secondMax(int[] nums) {
        // write your code here
        int max = nums[0];
        int second = nums[1];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > max) {
                second = max;
                max = nums[i];
            } else if (nums[i] <= max && nums[i] >= second) {
                second = nums[i];
            }
        }
        return second;
    }

24.主元素

public int majorityNumber(List<Integer> nums) {
        // write your code here
        Map<Integer, Integer> count = new HashMap();
        
        for(int i : nums) {
            if(count.containsKey(i)) {
                int v = count.get(i);
                count.replace(i, ++v);
            } else {
                count.put(i, 1);   
            }
            
            if(count.get(i) > nums.size()/2) {
                return i;
            }
        }
        
        return -1;
        
    }

25.杨辉三角

public List<List<Integer>> calcYangHuisTriangle(int n) {
        List<List<Integer> > res = new ArrayList<>();
        int i, j;
        if (n == 0) {
            return res;
        }
        
        for (i = 0; i < n; ++i) {
            List<Integer> t = new ArrayList<Integer>();
            t.add(1);   
            for (j = 1; j < i; ++j) {
                t.add(res.get(i - 1).get(j - 1) + res.get(i - 1).get(j));    
            }
            
            if (i > 0) {
                t.add(1);
            }
            
            res.add(t);
        }
        
        return res;
    }

26.旋转数组


rotate之前数组中位置i的元素在rotate之后位于位置(i+k) % nums.length

public int[] rotate(int[] nums, int k) {
        // Write your code here
       if (nums == null || k == 0) {
            return nums;
        }

        k = (k % nums.length);

        int[] helper = new int[nums.length];
        for (int i = 0; i < nums.length; ++i) {
            helper[(i+k)%nums.length] = nums[i];
        }
        return helper;
    }

27.翻转数组

public void reverseArray(int[] nums) {        
        // initialization
        int i = 0;
        int j = nums.length - 1;
        int tmp;
        
        // i and j not meet yet
        while (i < j) {
            // swap nums[i] and nums[j]
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            
            // ++i;
            // --j;
            i += 1;
            j -= 1;
        }
    }

28.分解质因数


解题思路:

先求得一个质数数组,然后从小到大遍历该数组,若题目所给整数能够被某质数整除,则将该数加入答案值数组。
算法流程:

  • 从小到大遍历[2,up],若num能够被i整除则循环除以i直到不能被整除,每次除以i都向答案值数组增加一个i,因为是从小到大遍历,则必定只有质数能被取为因数
  • up一般设定为sqrt(num),因为一个数大于其根号的质因数最多只有一个,那么遍历其根号内的数可以将时间复杂度减小至根号n,若遍历完prime后该数不为1,则其值为最后一个质因数
public List<Integer> primeFactorization(int num) {
        List<Integer> factors = new ArrayList<Integer>();
        for (int i = 2; i * i <= num; i++) {
            while (num % i == 0) {
                num = num / i;
                factors.add(i);
            }
        }
        //若最后剩余数不为1,则为最后一个质因数
        if (num != 1) {
            factors.add(num);
        }   
        return factors;
    }

29.反转字符串中的单词

public String reverseWords(String s) {
        // write your code here
        if (s.length() == 0 || s == null) {
            return "";
        }
        StringBuffer res = new StringBuffer();
        // 以” “分割字符串,末尾的空格会在数组中不存在
        String[] split = s.split(" ");
        for (int i = split.length - 1; i >= 0; i--) {
            if (!"".equals(split[i])) {
                // 第一个添加不了空格,因为长度还为0,然后添加单词。
                // 再是""+单词的组合,最后一个肯定不会多空格。
                if (res.length()>0){
                    res.append(" ");
                }
                res.append(split[i]);
            }
        }
        return res.toString();
    }

30.数组剔除元素后的乘积

public List<Long> productExcludeItself(List<Integer> nums) {
        
        long[] res = new long[nums.size()]; 
        long left = 1;
        res[0] = 1;
        for(int i = 1 ; i < nums.size(); i++ ) {
            left = left * (long)nums.get(i - 1);
            res[i] = left;
        }
        long right = 1;
        for(int i = nums.size() - 2; i >= 0 ; i-- ) {
            right = right * nums.get(i + 1);
            res[i] = res[i] * right;
        }
        
        List<Long> result = new ArrayList<>();
        for(long num : res) {
            result.add(num);
        }
        
        return result;
    }

四、字符串与循环

31.旋转字符串

public void rotateString(char[] str, int offset) 
    {
        if (str == null || str.length == 0 || offset == 0) return;
        
        offset = offset % str.length;
        String sstr = new String(str);
        
        String B = sstr.substring(str.length - offset, str.length);
        String A = sstr.substring(0, str.length - offset);
        String res = B.concat(A);
        char[] res_c = res.toCharArray();
        
        //str = res.toCharArray(); 不會被更新
        for (int i = 0; i < res_c.length; i++)
        {
            str[i] = res_c[i];
        }
    }

32.回文数

public boolean isPalindrome(int num) {
        if(num<10) return true;
        String s=String.valueOf(num);
        int l=s.length();
        for(int i=0;i<l/2;i++){
               if(s.charAt(i)!=s.charAt(l-i-1)){
                   return false;
               }
        }
        return true;
    }

33.大小写转换 II

public String lowercaseToUppercase2(String str) {

        // write your code here

        char[] s = str.toCharArray();

        for (int i = 0; i < s.length; i++) {

            if (s[i] >= 'a' && s[i] <= 'z') {

                s[i] -= 32;

            }

        }

        return String.valueOf(s);

    }

34.最后一个单词的长度

public int lengthOfLastWord(String s) {
        // write your code here
        String[] arr = s.trim().split(" ");
        String a = "";
        if("" != arr[arr.length-1]){
             a = arr[arr.length-1];
        }
        return a.length();
    }

35.最大字母

public String largestLetter(String s) {
        // write your code here
        Set<Character> characters = new HashSet<>();
        for (char chr: s.toCharArray()) {
            characters.add(chr);
        }
        for (int i = 25; i >= 0; i--) {
            char low = (char)((int)'a' + i);
            char upper = (char)((int)'A' + i);
            if (characters.contains(low) && characters.contains(upper)) {
                return String.valueOf(upper);
            }
        }
        return "NO";
    }

36.首字母大写

public String capitalizesFirst (String s) {
        // Write your code here
   StringBuilder strBld = new StringBuilder();
        char preChar = ' ';
        int offset = 'a' - 'A';
        for (char chr: s.toCharArray()) {
            if (preChar == ' ' && chr != ' ') {
                strBld.append((char)(chr - offset));
            } else {
                strBld.append(chr);
            }
            preChar = chr;
        }
        return strBld.toString();
    }

37.转换字符串到整数

public int stringToInteger(String target) {
        // write your code here
        return Integer.valueOf(target);
    }

38.字符串查找

public int strStr(String source, String target) {
        // Write your code here
        return source.indexOf(target);
    }

39.转换成小写字母

public String toLowerCase(String str) {
        // Write your code here
        char[]words = str.toCharArray();
        for(int i = 0;i < words.length;i++){
            if(words[i] >= 'A' && words[i] <= 'Z' ){
                words[i] = (char)(words[i]+32);
            }
        }
        return String.valueOf(words);
    }

40. 两字符串和

public String SumofTwoStrings(String A, String B) {
        // write your code here
        String result = "";
        int lenA = A.length(), lenB = B.length();
        int Aindex = lenA - 1, Bindex = lenB - 1;

        while(Aindex >= 0 && Bindex >= 0){
            int temp = (A.charAt(Aindex) - '0') + (B.charAt(Bindex) - '0');
            result = String.valueOf(temp) + result;
            Aindex--; Bindex--;
        }
        if(Aindex >= 0) result = A.substring(0, Aindex + 1) + result;
        if(Bindex >= 0) result = B.substring(0, Bindex + 1) + result;
        return result;
    }

41.最长单词

public List<String> longestWords(String[] dictionary) {
        // write your code here
        List<String> list = new ArrayList<>();
        if (dictionary.length == 0) {
    		return list;
    	}
    	
    	list.add(dictionary[0]);
    	for (int i = 1; i < dictionary.length; i++) {
    		if(dictionary[i].length() > list.get(list.size() - 1).length()) {
    			list.clear();
    			list.add(dictionary[i]);
    		} else if (dictionary[i].length() == list.get(list.size() - 1).length()) {
    			list.add(dictionary[i]);
    		} else {
    			continue;
    		}
    	}
    	return list;
    }

五、栈与队列

42.小括号匹配

public boolean matchParentheses(String string) {
        // write your code here
        Stack stack = new Stack();
        for(int i = 0;i < string.length();i++){
            if(string.charAt(i) == '('){
                stack.push(')');
            }else if(string.charAt(i) == ')'){
                
                if(stack.isEmpty()){
                    return false;
                }
                if(stack.peek().equals(')')){
                    stack.pop();
                }
            }
        }
        return stack.isEmpty();
    }

43.有效的括号序列

 public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
	    for (char c : s.toCharArray()) {
		    if (c == '(')
			    stack.push(')');
		    else if (c == '{')
			    stack.push('}');
		    else if (c == '[')
			    stack.push(']');
		    else if (stack.isEmpty() || stack.pop() != c)
			    return false;
	    }
	    return stack.isEmpty();
    }

44.实现栈

public class Stack {
	List<Integer> list = new ArrayList<Integer>();
    /*
     * @param x: An integer
     * @return: nothing
     */
    public void push(int x) {
        // write your code here
    	list.add(x);
    }

    /*
     * @return: nothing
     */
    public void pop() {
        // write your code here
    	list.remove(list.size()-1);
//    	return list.remove(-1);
    }

    /*
     * @return: An integer
     */
    public int top() {
        // write your code here
//    	return list.get(-1);
    	return list.get(list.size()-1);
    }

    /*
     * @return: True if the stack is empty
     */
    public boolean isEmpty() {
        // write your code here
    	return list.isEmpty();
    }
}

45.队列维护

public class MyQueue {
    /*
     * @param item: An integer
     * @return: nothing
     */  
    Node first;
    Node last;
    public MyQueue(){
        first = null;
        last = null;
    }
    // 队列是FIFO,所以设置first、last两个节点方便入队和出队操作。
    public void enqueue(int item) {
        // write your code here
        if(first == null) {
            // 采用先new再赋值,不会增加多余的节点。
            last = new Node(item);
            first = last;
        }
        else {
            last.next = new Node(item);
            last = last.next;
        }
    }

    /*
     * @return: An integer
     */
    public int dequeue() {
        // write your code here
        int res = 0;
        if(first != null) {
            res = first.val;
            first = first.next;
            return res;
        }
        // first == null时,意味者队列已经没有元素,返回-1
        return -1;
    }
}
class Node {
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
        this.next = null;
    }
}

46.二阶阶乘

public long doubleFactorial(int n) {
        // Write your code here
        long sum = n;
        for(int i = 1; i < n; i++){
            if(n % 2 == 0 && i % 2 == 0){
                sum *=i;
            }else if(n % 2 == 1 && i % 2 == 1){
                sum *=i;
            }
        }
        return sum;
    }

六、简单递归

47.斐波纳契数列


非递归写法

public int fibonacci(int n) {
        // write your code here
        if(n == 1)return 0;
        if(n == 2)return 1;
        int res = 0;
        int fb0 = 0;
        int fb1 = 1;
        for(int i = 3;i <= n;i++){
            res = fb0 +fb1;
            fb0 = fb1;
            fb1 = res;
        }
        return res;
    }

递归写法

public int Fibonacci(int n) {
        if(n == 0) {
            return 0;
        }
        if(n == 1) {
            return 1;
        }
        return Fibonacci(n-1) + Fibonacci(n-2);
    }

##  48. 二叉树的前序遍历
![在这里插入图片描述](https://img-blog.csdnimg.cn/6fedc67fa0614a29a064eaf13ab87310.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZCD5Zyf5aSn6a2U546L,size_17,color_FFFFFF,t_70,g_se,x_16)

```java
/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: A Tree
     * @return: Preorder in ArrayList which contains node values.
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        // write your code here
        List<Integer> result = new ArrayList<>();
        traversal(root, result);
        return result;
    }

    private void traversal(TreeNode node, List<Integer> result) {
        if (node == null) return;
        result.add(node.val);
        traversal(node.left, result);
        traversal(node.right, result);
    }
}

49.二叉树的中序遍历

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: A Tree
     * @return: Inorder in ArrayList which contains node values.
     */
    public List<Integer> inorderTraversal(TreeNode root) {
        // write your code here
        List<Integer> result = new ArrayList<>();
        traversal(root, result);
        return result;
    }
    private void traversal(TreeNode node, List<Integer> result) {
        if (node == null) return;
        traversal(node.left, result);
        result.add(node.val);
        traversal(node.right, result);
    }
}

50.二叉树的后序遍历

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: A Tree
     * @return: Postorder in ArrayList which contains node values.
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        // write your code here
     List<Integer> result = new ArrayList<>();
        traversal(root, result);
        return result;
    }
    private void traversal(TreeNode node, List<Integer> result) {
        if (node == null) return;
        traversal(node.left, result);
        traversal(node.right, result);
        result.add(node.val);
    }
}

更多推荐

初阶必刷编程50题