1旱函、? ? 對以下一組數(shù)據(jù)進行降序排序(冒泡排序)∶杼希“24棒妨,80,35,8券腔,9伏穆,54,76纷纫,45枕扫,5,63”
int array[10] = {24, 17, 85, 13, 9, 54, 76, 45, 5, 63};
int num = sizeof(array)/sizeof(int);
for(int i = 0; i < num-1; i++) {
for(int j = 0; j < num - 1 - i; j++) {
if(array[j] < array[j+1]) {
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
for(int i = 0; i < num; i++) {
printf("%d", array[i]);
if(i == num-1) {
printf("\n");
}
else {
printf(" ");
}
}
2辱魁、? ? 對以下一組數(shù)據(jù)進行升序排序(選擇排序)烟瞧。
void sort(int a[],int n)
{
int i, j, index;
for(i = 0; i < n - 1; i++) {
index = i;
for(j = i + 1; j < n; j++) {
if(a[index] > a[j]) {
index = j;
}
}
if(index != i) {
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
int main(int argc, const char * argv[]) {
int numArr[10] = {86, 37, 56, 29, 92, 73, 15, 63, 30, 8};
sort(numArr, 10);
for (int i = 0; i < 10; i++) {
printf("%d, ", numArr[i]);
}
printf("\n");
return 0;
}
3、? ? 快速排序算法
void sort(int *a, int left, int right) {
if(left >= right) {
return ;
}
int i = left;
int j = right;
int key = a[left];
while (i < j) {
while (i < j && key >= a[j]) {
j--;
}
a[i] = a[j];
while (i < j && key <= a[i]) {
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i-1);
sort(a, i+1, right);
4染簇、? ? 歸并排序
void merge(int sourceArr[], int tempArr[], int startIndex, int midIndex, int endIndex) {
int i = startIndex;
int j = midIndex + 1;
int k = startIndex;
while (i != midIndex + 1 && j != endIndex + 1) {
if (sourceArr[i] >= sourceArr[j]) {
tempArr[k++] = sourceArr[j++];
} else {
tempArr[k++] = sourceArr[i++];
}
}
while (i != midIndex + 1) {
tempArr[k++] = sourceArr[i++];
}
while (j != endIndex + 1) {
tempArr[k++] = sourceArr[j++];
}
for (i = startIndex; i <= endIndex; i++) {
sourceArr[i] = tempArr[i];
}
}
void sort(int souceArr[], int tempArr[], int startIndex, int endIndex) {
int midIndex;
if (startIndex < endIndex) {
midIndex = (startIndex + endIndex) / 2;
sort(souceArr, tempArr, startIndex, midIndex);
sort(souceArr, tempArr, midIndex + 1, endIndex);
merge(souceArr, tempArr, startIndex, midIndex, endIndex);
}
}
int main(int argc, const char * argv[]) {
int numArr[10] = {86, 37, 56, 29, 92, 73, 15, 63, 30, 8};
int tempArr[10];
sort(numArr, tempArr, 0, 9);
for (int i = 0; i < 10; i++) {
printf("%d, ", numArr[i]);
}
printf("\n");
return 0;
}
5参滴、? ? 實現(xiàn)二分查找算法(編程語言不限)
int bsearchWithoutRecursion(int array[],int low,int high,int target) {
while(low <= high) {
int mid = (low + high) / 2;
if(array[mid] > target)
high = mid - 1;
else if(array[mid] < target)
low = mid + 1;
else //findthetarget
return mid;
}
//the array does not contain the target
return -1;
}
----------------------------------------
遞歸實現(xiàn)
int binary_search(const int arr[],int low,int high,int key)
{
int mid=low + (high - low) / 2;
if(low > high)
return -1;
else{
if(arr[mid] == key)
return mid;
else if(arr[mid] > key)
return binary_search(arr, low, mid-1, key);
else
return binary_search(arr, mid+1, high, key);
}
}
6、? ? 如何實現(xiàn)鏈表翻轉(zhuǎn)(鏈表逆序)锻弓?
思路:每次把第二個元素提到最前面來砾赔。
#include
#include
typedef struct NODE {
struct NODE *next;
int num;
}node;
node *createLinkList(int length) {
if (length <= 0) {
return NULL;
}
node *head,*p,*q;
int number = 1;
head = (node *)malloc(sizeof(node));
head->num = 1;
head->next = head;
p = q = head;
while (++number <= length) {
p = (node *)malloc(sizeof(node));
p->num = number;
p->next = NULL;
q->next = p;
q = p;
}
return head;
}
void printLinkList(node *head) {
if (head == NULL) {
return;
}
node *p = head;
while (p) {
printf("%d ", p->num);
p = p -> next;
}
printf("\n");
}
node *reverseFunc1(node *head) {
if (head == NULL) {
return head;
}
node *p,*q;
p = head;
q = NULL;
while (p) {
node *pNext = p -> next;
p -> next = q;
q = p;
p = pNext;
}
return q;
}
int main(int argc, const char * argv[]) {
node *head = createLinkList(7);
if (head) {
printLinkList(head);
node *reHead = reverseFunc1(head);
printLinkList(reHead);
free(reHead);
}
free(head);
return 0;
}
7、? ? 實現(xiàn)一個字符串“how are you”的逆序輸出(編程語言不限)青灼。如給定字符串為“hello world”,輸出結(jié)果應(yīng)當為“world hello”暴心。
int spliterFunc(char *p) {
char c[100][100];
int i = 0;
int j = 0;
while (*p != '\0') {
if (*p == ' ') {
i++;
j = 0;
} else {
c[i][j] = *p;
j++;
}
p++;
}
for (int k = i; k >= 0; k--) {
printf("%s", c[k]);
if (k > 0) {
printf(" ");
} else {
printf("\n");
}
}
return 0;
}
8、? ? 給定一個字符串杂拨,輸出本字符串中只出現(xiàn)一次并且最靠前的那個字符的位置专普?如“abaccddeeef”,字符是b,輸出應(yīng)該是2。
char *strOutPut(char *);
int compareDifferentChar(char, char *);
int main(int argc, const char * argv[]) {
char *inputStr = "abaccddeeef";
char *outputStr = strOutPut(inputStr);
printf("%c \n", *outputStr);
return 0;
}
char *strOutPut(char *s) {
char str[100];
char *p = s;
int index = 0;
while (*s != '\0') {
if (compareDifferentChar(*s, p) == 1) {
str[index] = *s;
index++;
}
s++;
}
return &str;
}
int compareDifferentChar(char c, char *s) {
int i = 0;
while (*s != '\0' && i<= 1) {
if (*s == c) {
i++;
}
s++;
}
if (i == 1) {
return 1;
} else {
return 0;
}
}
9扳躬、? ? 二叉樹的先序遍歷為FBACDEGH,中序遍歷為:ABDCEFGH,請寫出這個二叉樹的后序遍歷結(jié)果脆诉。
ADECBHGF
先序+中序遍歷還原二叉樹:先序遍歷是:ABDEGCFH 中序遍歷是:DBGEACHF
首先從先序得到第一個為A,就是二叉樹的根贷币,回到中序,可以將其分為三部分:
左子樹的中序序列DBGE亏狰,根A役纹,右子樹的中序序列CHF
接著將左子樹的序列回到先序可以得到B為根,這樣回到左子樹的中序再次將左子樹分割為三部分:
左子樹的左子樹D暇唾,左子樹的根B促脉,左子樹的右子樹GE
同樣地,可以得到右子樹的根為C
類似地將右子樹分割為根C策州,右子樹的右子樹HF瘸味,注意其左子樹為空
如果只有一個就是葉子不用再進行了,剛才的GE和HF再次這樣運作够挂,就可以將二叉樹還原了旁仿。
10、? ? 打印2-100之間的素數(shù)孽糖。
int main(int argc, const char * argv[]) {
for (int i = 2; i < 100; i++) {
int r = isPrime(i);
if (r == 1) {
printf("%ld ", i);
}
}
return 0;
}
int isPrime(int n)
{
int i, s;
for(i = 2; i <= sqrt(n); i++)
if(n % i == 0)? return 0;
return 1;
}
11枯冈、? ? 求兩個整數(shù)的最大公約數(shù)毅贮。
int gcd(int a, int b) {
int temp = 0;
if (a < b) {
temp = a;
a = b;
b = temp;
}
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
1、給出一個由小寫字母組成的字符串尘奏,把所有連續(xù)出現(xiàn)的2個a替換成bb(2個b)滩褥,但是對于超過兩個連續(xù)的a,那么這些字符都不作替換炫加。例如:
bad -> bad(一個a瑰煎,不替換)
baad -> bbbd(替換成bb)
baaad -> baaad(連續(xù)三個a,不替換)
apaapaaapaa -> apbbpaaapbb(這里連續(xù)的a出現(xiàn)了4次俗孝,只有第二段和最后一段被替換)
- (NSString*)replace:(NSString*)str {// CODE HERENSMutableString*retString = [NSMutableStringstringWithString:str];// 準備替換的字符串NSString*replaceString =@"bb";// 正則表達式 (^a{2}[^a]) 以aa(第三個字母不是a)開頭酒甸,([^a]a{2}[^a]) 字符串中間的aa(前后都不是a),([^a]a{2}$) 以aa結(jié)尾(倒數(shù)第三個字母不是a)NSRegularExpression*regular = [[NSRegularExpressionalloc] initWithPattern:@"(^a{2}[^a])|([^a]a{2}[^a])|([^a]a{2}$)"options:NSMatchingReportProgresserror:nil];NSRangerange;do{? ? ? ? range = [regular rangeOfFirstMatchInString:retString options:NSMatchingReportProgressrange:NSMakeRange(0, retString.length)];if(range.length ==4) {// 替換中間的aa[retString replaceCharactersInRange:NSMakeRange(range.location +1,2) withString:replaceString];? ? ? ? }elseif(range.length >0) {if(range.location ==0) {// 替換開頭的aa[retString replaceCharactersInRange:NSMakeRange(range.location,2) withString:replaceString];? ? ? ? ? ? }else{// 替換結(jié)尾的aa[retString replaceCharactersInRange:NSMakeRange(retString.length -2,2) withString:replaceString];? ? ? ? ? ? }? ? ? ? }? ? }while(range.length >0);returnretString;}
2驹针、給出一個字符串烘挫,其中只包含括號(大中小括號“()[]{}”),括號可以任意嵌套柬甥。如果同樣的左右括號成對出現(xiàn)并且嵌套正確饮六,那么認為它是匹配的。例如:()? ->? TRUE(匹配)
[()]? ->? TRUE(匹配苛蒲,括號可以嵌套)
()() ? ->? TRUE(匹配卤橄,括號可以并列排列)
({}([]))? ->? TRUE(匹配,括號可以任意嵌套臂外,大括號不必在外)
) ? ->? FALSE(不匹配窟扑,缺少左括號)
(} ? ->? FALSE(不匹配,左右括號不一樣)
{)(} ? ->? FALSE(不匹配漏健,左右括號相反)
- (BOOL)isMatch:(NSString *)str {// CODE HERE// 采用進站出站的思想嚎货,遍歷完字符串時如果array為空則匹配成功,否則失敗NSMutableArray *array = [NSMutableArray array];for(inti =0; i < str.length; i++) {inttag = [selfcreateTagWithString:[strsubstringWithRange:NSMakeRange(i,1)]];if(tag !=0) {intlastTag = [[array lastObject] intValue];if((lastTag + tag) ==0) {? ? ? ? ? ? ? ? [array removeLastObject];? ? ? ? ? ? }else{? ? ? ? ? ? ? ? [arrayaddObject:@(tag)];? ? ? ? ? ? }? ? ? ? }? ? }returnarray.count ==0;}- (int)createTagWithString:(NSString *)str {if([strisEqualToString:@"("]) {return-1;? ? }elseif([strisEqualToString:@")"]) {return1;? ? }elseif([strisEqualToString:@"["]) {return-2;? ? }elseif([strisEqualToString:@"]"]) {return2;? ? }elseif([strisEqualToString:@"{"]) {return-3;? ? }elseif([strisEqualToString:@"}"]) {return3;? ? }return0;}
3蔫浆、寫一個函數(shù)殖属,找出一個數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字,如果數(shù)字不存在瓦盛,則返回-1洗显。例如:
[0, 1, 2] ? ? ? ? ? ? --> ? ? -1(每個數(shù)字只出現(xiàn)1次)
[0, 1, 2, 1] ? ? ? ? -->-1(1出現(xiàn)了2次,剛好一半)
[0, 1, 2, 1, 1] ? ? --> ? ? 1(1出現(xiàn)了3次原环,超過一半)
(注:數(shù)組不是按從小到達排序的挠唆,也許排序之后更容易找到這個數(shù),但是有沒有更好嘱吗、更快的方法在不重新調(diào)整順序的情況得到結(jié)果玄组?)
- (int)mode:(NSArray*)array {// CODE HERE// 將集合中得數(shù)字轉(zhuǎn)存到字典中,數(shù)字做key,對應(yīng)出現(xiàn)的次數(shù)做valueNSMutableDictionary*modeMap = [NSMutableDictionarydictionary];? ? [array enumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {NSString*key = obj;idcount = modeMap[key];inti = [(NSNumber*)count intValue];? ? ? ? [modeMap setObject:@(i +1) forKey:key];? ? }];? ? __blockintretInt =-1;// 遍歷字典巧勤,找出其中value大于集合一半的key并返回[modeMap.allKeys enumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {NSString*key = obj;intmode = [modeMap[key] intValue];if(mode > array.count /2) {? ? ? ? ? ? retInt = key.intValue;? ? ? ? ? ? *stop =YES;? ? ? ? }? ? }];returnretInt;}