Q : 請問以下何者為不合法的變數名稱?

 1. _aB        2. AB        3. 2ab        4. A_B        5. Black        6.  Break

 

 

--------------------------------------------------------------------------------------------------------------

 

 

 

Ans: 3

(Note : 第六選項  "Break" 因為是大寫 B 與 "break"被視為兩個不同的變數

,故雖不建議使用,但依然被視為合法變數)

 

 

解析 : 

1. 變數名稱可為任何英文與數字的組合 (包含底線 __ )

2. "保留字" 不可為變數名稱 如: goto    break    case ....等等

 

以下是C語言的保留關鍵字:

char short int unsigned
long float double struct
union void enum signed
const volatile typedef auto
register static extern break
case continue default do
else for goto if
return switch while sizeof

 

(資料來源:維基百科-C語言)

 

C 發表在 痞客邦 留言(1) 人氣()

Q: 請寫出以下輸出值

#include <stdio.h>
#include <stdlib.h>    
#include <math.h>
    
int main ()
{
    char str[10]="hello!";
    int a = strlen(str);    
    int b = sizeof(str);
    
    printf("%d\n",a);
    printf("%d\n",b);
}

 

 

--------------------------------------------------------------------------------------------------------------

 

 

 

Ans: 6, 10

 

 

解析 : 

此題為必拿分的觀念題。以下為幾個必知道的觀念:

1.  strlen ()  只適用於 string的長度計算,並且不包含'\0' 結束符號 ( null character )

2. sizeof()  可用於 取得數值型別的位元組大小 如: sizeof (int)

                             , 計算此 data type 所佔的位元組大小 (4)

                        ,當然也可如上題用來計算此字串所佔的位元組大小  

                              (由 "    char str[10]" 可知此字串大小為10)

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

 

原文

 

Question:

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input:   (2 ->  4  ->  3) + (5 -> 6  ->  4)
Output: 7  ->​​​​​​​ ​​​​​​​ 0  ->​​​​​​​ ​​​​​​​ 8

 


翻譯

 

問題:

      給定兩個非空的鍊結串列,分別代表兩個非負整數串列,串列內每個元素皆由反方向儲存(越前面的節點位數越低),每一個節點代表一個位元。

將此兩個鍊結串列相加並回傳

 

解答:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *newNode(int data)
{
    struct ListNode *NewNode = (struct ListNode *) malloc(sizeof(struct ListNode));
    NewNode->val = data;
    NewNode->next = NULL;
    return NewNode;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    
    struct ListNode *head    = NULL;
    struct ListNode *current = NULL;
    struct ListNode *rear    = NULL;
    int temp    = 0 , result = 0;
    
    while (l1 != NULL || l2 != NULL)
    {
        // 計算總合
        result = temp + (l1? l1->val: 0) + (l2? l2->val: 0);
        
        // 進位處理
        temp   = (result >= 10)? 1 : 0;
        result = (result >= 10)? (result-10):result;
        
        // 節點串連
        current = newNode(result);
        if (!head)
            head = current;
        else
            rear-> next = current;

        rear = current;
        
        //指標後移 
        if (l1) 
            l1 = l1->next;
        if (l2) 
            l2 = l2->next;    

        //最後的進位處理   
        if (temp == 1)
            rear->next = newNode(1);
    }
    return head;
}

解析:

      此題為難度中級,需具備linklist基本概念與細心的進位處理。

需要注意的是: 

1. 基本功能 如: new node (新增節點),最好可獨立出另一個function,增加程式的可讀性

2. 可多善加使用 如: bigger number = (5>3)?5:3; 的技巧來簡化程式

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

 

原文

 

Question:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

 

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

 

 


翻譯

 

問題:

給定一個整數陣列 nums 與一個特定值 T ,回傳一組index [ a , b] ,而使得 T = nums [a] + nums [b].

注意:不可重複使用同一個元素 Ex :  6 = 3 + 3 是不合法的。

 

解答:

int twoSum(int *nums ,int length, int target) 
{
    static int answer[2] = {0};
    
     for (int i = 0 ; i < length; i++)
     {
        for (int j = i+1 ; j < length ; j++)
        {
            if((nums [i] + nums [j]) == target)
            {
                answer[0] = i;
                answer[1] = j;
                    
                return answer;
            }
        }
     }
     return 0;
}

 

解析:

      此題為簡單的熱身題,使用一般暴力破解法,窮舉所有可能即可得到答案。

需要注意的是: 

1.  "所有可能" 只需檢查一次即可,所以 j = i+1 而非從 0 開始。

2.  宣告 int answer 時,記得加上 static 其目的是使陣列 answertwoSum() 結束時,依然可保留其記憶體位置而不被刪除。

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

第一題  : 請擷取出Input中的第七個bit值?

 

-------------------------------------------------------------------------------------------------------------

 

Ans :

此題題意簡單明瞭,解法也不複雜。

步驟一 : 加上一個Mask遮罩( & ),只保留欲取出的bit位置。

步驟二 : 向右shift (7-1) 位元,剩下的就是你要的答案。

 

 

 

 

第二題 : 請擷取出Input中的第N個bit值?

-------------------------------------------------------------------------------------------------------------

 

 

Ans : 此題為上題的延伸,只要仔細觀察一定可以看出規則出來。

Hint : 可用 pow (x, y )  = x^y 來快速算出次方。

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

Q :   請寫出將會印出的值

 

 

 

-------------------------------------------------------------------------------------------------------------

 

 

Ans :

此題為簡單的送分題,sizeof函數回傳該變數所佔的byte數並印出,

不同的資料型態的size為基本觀念須熟記。

另外需注意本題的兩個陷阱

1.  計算字串陣列的size大小時,須連同"空白"與最後的"空字符"(Null character) 也一同加進去。

2.  sizeof( *p ) 所代表的是該指標所指向位置的資料型態,此題*p所指向的是char,所以也等於sizeof(char)

     (另外 sizeof (p) 代表的又是不同的意思,可自行寫code試看看結果)

 

 

故答案為

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

Q :   請寫出將會印出的值

 

 

Ans :  

首先,*p = a 代表的是 pointer p 指向陣列a的記憶體位置,

而其值也就是該陣列的第一位元,所以此時 *p = 1 。

 

而之後的兩個運算式又可看成

*p++   += 100;

*++p   += 100;

 

++ 在後 優先權最低  先取值 +=100 再 指標後移。

++ 在前 優先權最高  先指標後移 再取值 +=100。

 

故答案為 

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

此篇分享的是難度較高的 pointer 考題。

 

pointer類型的題目在C語言的面試考題中幾乎是必考!

而之所以會成為主管最愛考題原因有三:

1. 題目簡單明瞭,不會題意不清。

2. 鑑別度高,對於少寫程式的人來說相對陌生。

3. 變化性高,可隨意變換題目,不易重複。

 

以下為真實面試考題分享 :

 

題目

請寫出將會印出的兩行字串


答案

Ans: 此題須同時計算*p值與s字串,

第一行字串為 : 0113234

第二行字串為 : 0123456


解析

首先, *p = s 所代表的含意為 pointer p 指向字串s的第一個位址,

字串s第一個位址值為0,而接下來一連串的運算可分成四類:

*p++   =   *(p++) 先取值 後指標下移
*++p   =   *(++p) 先指標下移 後取值
++*p   =   ++(*p) 先值+1 後取值
(*p)++ 先取值 後值+1

 

雖然看似複雜,但仔細觀察還是可看出規則,

*p = 取值

  p = 取指標位址

++在前  =  先加1再取值

++在後  =  先取值後加1

 

多練習幾遍,以後看到此類型的題目肯定能輕鬆取分。

 

延升閱讀

科技業筆試 常考觀念題  

1. 指標  2. 資料型態 3. 位元運算

國外面試考什麼

LeetCode 練習 - Two Sum 解析 (Easy)    

LeetCode 練習 - Add Two Numbers 解析 (Medium)

 

文章標籤

C 發表在 痞客邦 留言(2) 人氣()

此篇只涉及C語言的基礎概念,熟悉C語言的開發者可跳過此篇。

 

在應徵程式設計師的面試中,常會有該語言的專業測驗,

而專業測驗的成績更會直接影響面試結果,

故在面試前好好熟悉該語言是非常重要的。

 

 

以下為真實面試考題分享:

第一題 : 請寫出將會印出的值

 

Ans : 答案為-2,相信大家都答得出來。

 

第二題 : 請寫出將會印出的值

 

Ans : 答案為15,當寫成 if ( a = 10)時,  a會被改值為 10

而又因為括號內為大於0的值 = True , 故印出的值為 a + b 

 

 

若以上兩題都能輕鬆解答的人,代表您對於C語言有一定程度的理解,

而第三題考的是 您對於程式熟悉度與coding的靈活性。

 

 

 

第三題 : 以上兩題可看出 (a == 10) 與 (a = 10),此兩條件式的誤植,

會造成答案的巨大差異,請問有何種方式可完全避免此問題?

 

Ans :  將條件式寫相反 (10 == a), 程式依然可正確執行。

而若誤植為 (10 = a),因為10無法賦予值,將無法編譯成功。

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()

此文章僅介於中文教學資源之缺乏,

在此提供Flash Specification 導讀以供參考。

以下討論為SLC,MLC等較早期的flash,適合剛入門的讀者。

 

 

對於初入NandFlash領域的新手來說,

是否對於spec上滿滿的英文感到無所適從?

 

首先,先來認識幾個名詞解釋:

1.page - flash 讀寫的最小單位。

2.block - 由數百至數千個page堆疊而成,也是刪除資料的最小單位。

3.plane - 由數百個block堆疊而成,muti-plane可增加效能。

4.Lun -也稱作die,可單獨執行指令的最小單位。

 

 

以上為flash記憶體架構基本組成成員,

而欲精準指定資料儲存位置就得依靠5-cycle的幫忙。

因為硬體關係,每一個cycle為8個bit.

 

 

Array Addressing
CA7 CA6 CA5 CA4 CA3 CA2 CA1 CA0
LOW CA14 CA13 CA12 CA11 CA10 CA9 CA8
PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
BA15 BA14 BA13 BA12 BA11 BA10 BA9 PA8
LOW LOW LOW BA20 BA19 BA18 BA17 BA16

CA - column address, 可精準指定page的某一片段寫入資料。

PA - page address, 代表page0~pageX.

BA - block address, 代表block0~ blockX. 

 (而通常first bit of block為plane bit)

 

 

現在已經知道5-cycle的使用方式,

而又是什麼使得flash得以接收到5-cycle資料的呢?

 

以下為幾個常用pin腳的基本介紹:

1. CE# - 獨立控制該顆memory的開啟或是關閉。

2. ALE - 當host欲傳送address information時,此pin會設為High.

3. CLE - 當host欲傳送command information時,此pin會設為High.

4. WE - write enalbe, 控制寫入的pin腳。

5. RE - read enable, 控制讀取的pin腳。

6. DQX - 為雙向I/0 pin, 頻寬多為8bit.

7. WP - write protect,防止不可預期的寫入刪除行為。

8. R/B - ready/busy,用來確認該memory當下的狀態。

 

 

Spec後半段為command介紹,

相信有了以上基礎概念後可輕鬆應付,故在此就不繼續贅述了,

希望此篇粗淺的導讀能幫助對NandFlash有興趣的人。

 

文章標籤

C 發表在 痞客邦 留言(0) 人氣()