愛奇藝筆試編程題 (學習之旅)

NO.7

今天參加了愛奇藝的筆試,來分享一下編程題,就是很簡單的兩道題:
1.在一個字符串中找到第一個出現一次的字符,並返回ascii 碼
public class main {
    public static char firstOne(String s)
    {
        int result = 0;
        char temp;
        int[] num = new int[52];
        for (int i = 0; i < s.length(); i ++)
        {
            temp = s.charAt(i);
            //判斷字符,
            if ( temp >= 'a' && temp <= 'z' )
            {
                num[temp - 'a']++;
            }
            else
                if (temp >= 'A' && temp <= 'Z')
                {
                    num[temp - 'A' + 26] ++;
                }
        }
        //如果只出現一次。且是第一次,直接輸出,然後break;
        for (int i = 0; i < num.length; i ++)
        {
            if (num[i] == 1)
            {
                if (i >= 0 && i <=26)
                {
                    result = i+97;
                }
                else
                    result = i+65-26;
                break;
            }
        }
        return result;
    }
}
大概形式和上面的差不多,只要進行修改一下便可

2.n個人圍成一圈,按順序排序,從第一個人開始報數,報到3 的人退出最後留下的第幾號
 public static int main(String[] args) {
        // TODO Auto-generated method stub
        int n = 0 ;
        Scanner input = new Scanner(System.in);
        int p = input.nextInt();
        /**** 初始化人員 ***/
        boolean[] per = new boolean[p];// false表示退出
        for (int i = 0; i < per.length; i++) {
            per[i] = true;
        }

        int t = 0, len = per.length;
        while (len > 1) {
            for (int i = 0; i < per.length; i++) {

                if (per[i]) {
                    t++;
                    if (t == 3) {
                        t = 0;
                        per[i] = false;
                        len--;
                    }
                }          
                  }
        } 
        for (int i = 0; i < per.length; i++) {
            if (per[i]) {
                n = i ;
            }
        }
    return n;
    }
今天做得額外的一道經典算法題:
大概意思就是,把二叉查找樹轉換成雙向鏈表
//
//  main.c
//  BSTree
//
//  Created by 江志德 on 15/9/26.
//  Copyright © 2015年 江志德. All rights reserved.
//

/*
 輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只調整指針的指向。 比如將二元查找樹
 10
 /        \
 6         14
 /     \      /  \
 4      8   12  16
 轉換成雙向鏈表

 4=6=8=10=12=14=16。

 分析:本題是微軟面試100題的第一題,由於樹本身定義就屬於遞歸式定義,所以很多與樹相關的題目都是用遞歸的思路來解決,本題亦是如此。下面我們用兩種不同的遞歸思路來分析。

 思路一:中序遍歷的順序即是我們所要建立鏈表的順序。所以可以在中序遍歷整棵樹的同時,通過調整節點的指針來將其轉換爲雙向鏈表。當所有結點都訪問過之後,整棵樹也就轉換成一個排序雙向鏈表了。

 思路二:當我們到達某一結點準備調整以該結點爲根結點的子樹時,先調整其左子樹,將左子樹轉換成一個排好序的左子鏈表,再調整其右子樹轉換右子鏈表。最後鏈接左子鏈表的最右結點(左子樹的最大結點)、當前結點和右子鏈表的最左結點(右子樹的最小結點)。從樹的根結點開始遞歸調整所有結點。
*/

#include <stdio.h>
#include <stdlib.h>
//樹的結構
struct BSTreeNode {
    int value;
    struct BSTreeNode *left;
    struct BSTreeNode *right;
};
//
void Convert( struct BSTreeNode * head, struct BSTreeNode * tail, struct BSTreeNode *root ) {
    struct BSTreeNode * left,* right;

    if ( root == NULL ) {
        head = NULL;
        tail  = NULL;
        return;
    }

    Convert( head, tail , root->left );
    Convert(head, tail , root->right );

    if ( left != NULL ) {
        left->right = root;
        root->left = left;
    }
    else {
        head = root;
    }
    if ( right != NULL) {
        root->right = right;
        right->left = root;
    }
    else {
        tail = root;
    }

}

struct BSTreeNode *treeTolinkedList( struct BSTreeNode *root ) {
    struct BSTreeNode *head,*tail;
    Convert( head , tail , root );
    return  head;
}
//創建樹,以-1結束
struct BSTreeNode *CreatBSTree() {
    int data;
    struct BSTreeNode *tree;
    scanf("%d " , &data );
    if (data == -1 ) {
        return NULL;
    }
    else {
        tree = ( struct BSTreeNode *)malloc( sizeof(struct BSTreeNode ) ) ;
        tree->value = data;
        tree->right = CreatBSTree();
        tree->left = CreatBSTree();

        return tree;
    }
}

//中序歷遍二叉樹
void InOrderTraverse( struct BSTreeNode *root ) {
    if (root->left) {
        InOrderTraverse(root->left );
    }
    if (root) {
        printf("%d", root->value ) ;
    }
    if ( root->right ) {
        InOrderTraverse(root->right );
    }
}

int main () {
    struct BSTreeNode *root = CreatBSTree();
    InOrderTraverse(root);

    printf("\n");

    struct BSTreeNode *head = treeTolinkedList( root );

    struct BSTreeNode *temp = head;

    while ( temp != NULL ) {
        printf( "%d", temp->value );
        temp = temp->right;
    }

    getchar();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章