JAVA-算法

/**
 * 给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。
 * 
 * 思路: 从左往右和从右往左输出的字符串都是一样的就是回文字符串
 * 将字符串转为数组,然后循环数组,循环的个数是对数组除以2, 然后判断数组的第一个和最后一个是否一致,然后依次对比,
 * 如果发现不一致,则认为不是回文
 * 
 * 
 * @param str string字符串 待判断的字符串
 * @return bool布尔型
 */
public boolean judge(String str) {
    if (str.length == 0) {
        return false; // 或者抛错
    }

    if (str.length() == 1) {
        return true;
    }

    char[] strArr = str.toCharArray();

    boolean isJudge = true;
    int strArrleng = strArr.length;

    for (int i = 0; i < strArrleng / 2 ; i++) {
        if (strArr[i] != strArr[strArrleng - i - 1]) {
            isJudge = false;
            break;
        }
    }

    return isJudge;
}

/**
 * NC103 反转字符串
 * 描述
 * 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。
 */
public String solve (String str) {
    if (str.length() < 0 || str.length() > 1000) {
        throw new RuntimeException("非法字符串");
    }
    
    StringBuffer s = new StringBuffer();
    
    char[] strArr = str.toCharArray();
    for (int i = strArr.length - 1; i >= 0 ; i--) {
        s.append(strArr[i]);
    }
    
    return s.toString();
}

public String solve (String str) {
        if (str.length() < 0 || str.length() > 1000) {
            throw new RuntimeException("非法字符串");
        }
     
        char[] strArr = str.toCharArray();
        int strArrLeng = strArr.length;

        for (int i = 0; i < strArrLeng / 2; i++) {
            if (strArr[i] == strArr[strArrLeng - i - 1]) {
                continue;
            }
            
            char temp = strArr[i];
            strArr[i] = strArr[strArrLeng - i - 1];
            strArr[strArrLeng - i - 1] = temp;
        }
        
        return String.valueOf(strArr);
    }


/**
 * 描述:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
 * 
 * 注: 借助于JAVA的十进制转二进制的方法
 */
public int numberOf1(int n) {
    String str = Integer.toBinaryString(n); // 返回int变量的二进制表示的字符串。

    char[] strArr = str.toCharArray();
    int count = 0;
    for (int i = 0; i < strArr.length; i++) {
        if (strArr[i] == '1') {
            count++;
        }
    }
       
    return count; 
}

/**
 * 冒泡排序 - 从大到小排序
 */
public static int[] sort(int[] sortArr) {
    int sortSize = sortArr.length;
    for (int i = 0; i < sortSize - 1; i++) {
        for (int j = 0; j < sortSize - i -1; j++) {
            if (sortArr[j] < sortArr[j + 1]) {
                int temp = sortArr[j];
                sortArr[j] = sortArr[j + 1];
                sortArr[j + 1] = temp;
            }
        }
    }

    return sortArr;
}

/**
 * 冒泡排序 - 从小到大排序
 */
public static int[] sort(int[] sortArr) {
    int sortSize = sortArr.length;
    for (int i = 0; i < sortSize - 1; i++) {
        for (int j = 0; j < sortSize - i - 1; j++) {
            if (sortArr[j] > sortArr[j + 1]) {
                int temp = sortArr[j];
                sortArr[j] = sortArr[j + 1];
                sortArr[j + 1] = temp;
            }
        }
    }

    return sortArr;
}


/**
  * 1. 第一个只出现一次的字符
  *
  * 解释: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
  *
  * 方法比较笨,使用了双层循环
  */
public int FirstNotRepeatingChar(String str) {
    if (str == null || str == "") {
        return -1;
    }
    
    char[] strArr = str.toCharArray();
    
    int index = -1;
    boolean isTrue = false;

    for (int i = 0; i < strArr.length; i++) {
        for (int j = 0; j < strArr.length; j++) {
            if (strArr[i] == strArr[j]) {
                if (index == -1) {
                    index = j;
                } else {
                    index = -1;
                    break;
                }
            }
        }
        
        if (index != -1) {
            break;
        }
    }
    
    return index;
}

/**
 * 描述
 * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
 * 所有的偶数位于数组的后> > 半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 * 
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型一维数组
 */
public int[] reOrderArray (int[] array) {
    int leg = array.length;
    
    if (leg <= 1) {
        return array;
    }
    
    int oddCount = 0;
    for (int i = 0; i < leg; i++) {
        if (array[i] % 2 == 1) {
           oddCount++;
        }
    }
    
    if (oddCount == 0) {
        return array;
    }
    
  
    int[] newArr = new int[array.length];
    int oddNow = 0;
    for (int i = 0; i < leg; i++) {
        if (array[i] % 2 == 1) {
           newArr[oddNow] = array[i];
           oddNow++;
        } else {
            newArr[oddCount] = array[i];
            oddCount++;
        }
    }
    
    return newArr;
}

/**
 * 描述 :
 * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 * 保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
 */
public double Power(double base, int exponent) {
    double tempBase = base;
    if (exponent == 0) {
        return 1;
    }
    
    int loop = exponent > 0 ? exponent : -exponent;
    
    for (int i = 1; i < loop; i++) {
        tempBase = base * tempBase;
    }
    
    return exponent > 0 ? tempBase :  1 / tempBase;
}

/**
 *
 * 描述:
 * 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
 * 括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
 * 
 * 思路: 循环字符串,判断第一个字符,将对应的另一个字符放到堆栈中,如果下一个和当前出栈的字符串是否一致,
 * 如果一致则继续,如果不一致则返回false.
 *
 */
public boolean isValid (String s) {
    // write code here
    char[] sArray = s.toCharArray();
    Stack<Character> stack = new Stack<>();
     
    for (char alp : sArray) {
        if(alp == '('){
            stack.push(')');
        }else if(alp == '['){
            stack.push(']');
        }else if(alp == '{'){
            stack.push('}');
        }else if(stack.isEmpty() || stack.pop()!= alp){
            return false;
        }
    }
    
    return stack.isEmpty();
}

/**
 *
 * 计算除去空格的最长字符串长度
 * 例如: "the stop world";
 * 结果: 5
 */
public static void main(String[] args) {
    String str = "the stop world";
    char[] strArray = str.toCharArray();
    int maxCount = 0;
    int tempCount = 0;

    for (int i = 0; i < strArray.length; i++) {
        // 注意, 需要处理最后一个字符
        if (strArray[i] == ' ' || strArray.length - 1 == i) {
            if (strArray.length - 1 == i) {
                tempCount++;
            }

            maxCount = Math.max(tempCount, maxCount);
            tempCount = 0;
        } else {
            tempCount++;
        }
    }

    System.out.println(maxCount);
}

/**
 *
 * 描述
 * 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
 * 如输入{1,2,3}的链表如下图:
 *
 * 返回一个数组为[3,2,1]
 * 0 <= 链表长度 <= 10000
 */

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        while (listNode != null) {
            list.add(listNode.val);
            listNode = listNode.next;
        }
        
        Collections.reverse(list);
        
        return list;
    }
}

/**
 * 包含min函数的栈
 * 序号 stock 相关方法描述
 * 1. boolean empty() 测试堆栈是否为空。
 * 2. Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
 * 3. Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。
 * 4. Object push(Object element) 把项压入堆栈顶部。
 * 5. int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。
 */
import java.util.Stack;

public class Solution {
    // 入栈的所有对象
    private Stack<Integer> s1 = new Stack();
    // 每次入栈之后,获取peek()最高栈(最小值),然后放入栈中
    private Stack<Integer> minStock = new Stack();
    
    public void push(int node) {
        // 入栈
        s1.push(node);
        // 如果最小栈对象为空,则放入,如果最小栈对象不为空,则取出栈顶(最小值)和入栈的值做比较,取出最小的值,放入栈顶。
        if (minStock.isEmpty()) {
            minStock.push(node);
        } else {
            minStock.push(Math.min(node, minStock.peek()));
        }
    }
    
    // 每次出栈,两个对象都是从后面出栈
    public void pop() {
        s1.pop();
        minStock.pop();
    }
    
    // 最近一次入栈的数据
    public int top() {
       return  s1.peek();
    }
    
    // 顶部为全栈最小值
    public int min() {
        return minStock.peek();
    }
}

/**
 *
 * [数组中出现次数超过一半的数字]
 * 
 * 思路: 出现一个新的数字,放入对应的MAP中,key是值,value是出现的次数,判断如果次数大于总数的一半以上,则退出,并确定该数字。
 *
 */
import java.util.*;

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int leg = array.length;
        if (leg < 1 || leg > 50000) {
            throw new RuntimeException("非法数组");
        }
        
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
       
        int legHalf = leg / 2 + leg % 2;
        int temp = 0;
        
        for (int i = 0; i < leg; i++) {
            int temp1 = array[i];
            if (map.get(temp1) == null) {
                map.put(temp1, 1);

            } else {
                map.put(temp1, map.get(temp1) + 1);
            }
            
            if (map.get(temp1) == legHalf) {
                temp = temp1;
                break;
            }
            
        }
        
        return temp;
    }
}

/**
 * [数组中出现次数超过一半的数字]
 * 思路: 超过一半以上的数字,所以该数字的出现次数一定是最多之一,看一个相同的则加1,看见不相同的则减去1,这样如果是偶数可能是0,这样显示的是最后一次出现的那个数字,如果是基数,则最后的出现的次数一定大于1.
 *
 */
public int MoreThanHalfNum_Solution1(int [] array) {
    int voted = 1;
    int res = array[0];
    for(int i=1;i<array.length;i++){
        if(array[i] == res){
            voted++;
        }else{
            voted--;
            if(voted == 0){
                voted = 1;
                res = array[i];
            }
        }
    }
    return res;
}

/**
  * [字符串替换 - 方案1]

  * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  *
  * 
  * @param s string字符串 
  * @return string字符串
  */
 public String replaceSpace (String s) {
     StringBuilder sb = new StringBuilder();
     
     for (int i = 0; i < s.length(); i++) {
         if (s.charAt(i) == ' ') {
             sb.append("%20");
         } else {
             sb.append(s.charAt(i));
         }
     }
     
     return sb.toString();
 }


/**
 *  [字符串替换 - 方案2]
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param s string字符串 
 * @return string字符串
 */
public String replaceSpace (String s) {
    return s.replace(" ", "%20");
}

/**
 * 方案1
 * 
 * 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
 * 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 *
 */
public boolean Find(int target, int [][] array) {
    boolean isHas = false;
    for (int i = 0; i < array.length; i++) {
        for (int j = 0 ; j < array[i].length; j++) {
            if (array[i][j] == target) {
                isHas = true;
                break;
            }
        }
        
        if (isHas) {
            break;
        }
    } 
    
    return isHas;
}

/**
 * 方案2
 * 
 * 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
 * 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 *
 */
import java.util.*;
public class Solution {
    public boolean Find(int target, int [][] array) {
        boolean isHas = false;
        for (int i = 0; i < array.length; i++) {
            if (Arrays.binarySearch(array[i], target) >= 0) {
                isHas = true;
                break;
            }
        }
         
        return isHas;
    }
}

题目大多来自牛客网.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容