问题1:逆转字符串
逆转字符串,就是指将一个字符串头尾倒置,变成一个新的字符串
如:abcdefg -> gfedcba
逆转的方法: 只需要遍历一半字符串,并将对应位置上的字符对换即可。字符串中的字符对应一个正整数,因此下面的三种方法都是利用了变换两个整型变量的思想。
利用最简单的交换两个变量的值的方法:
char* Reverse(char* str, int length)
{
for (int i = 0; i < length / 2; ++i)
{
char tmp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = tmp;
}
str[length] = 0;
return str;
}
问题2:大小端判断
void byte_mode()
{
int value = 0x1;
if( *(char *)&value = 0x1)
{
printf("little end\n");
}
else
{
printf("big end\n");
}
}
问题3:两个有序数组,合并成一个有序数组。如果第一个数组空间足够容纳两个数组。
换一种思路,我们採用从后往前合并。首先计算出总长度。设置一个指针从num1数组最后往前移动。
void merge(int* nums1, int m, int* nums2, int n) {
int newIndex=m+n-1;
int nums1I=m-1,nums2I=n-1;
while(nums1I>=0 && nums2I>=0){
if(nums1[nums1I]>=nums2[nums2I]){
nums1[newIndex]=nums1[nums1I];
newIndex--;
nums1I--;
}else{
nums1[newIndex]=nums2[nums2I];
newIndex--;
nums2I--;
}
}
while(nums1I>=0){
nums1[newIndex]=nums1[nums1I];
newIndex--;
nums1I--;
}
while(nums2I>=0){
nums1[newIndex]=nums2[nums2I];
newIndex--;
nums2I--;
}
}
问题4:给一个有序数组 arrys, 原地删除重复出现的元素,使每个元素 只出现一次, 不使用额外的数组空间.
int remove(int* arrys, int arrysSize){
if (arrysSize < 2)
{
return arrysSize;
}
int j = 0;
for (int i = 1; i < arrysSize; i++)
{
if (arrys[j] != arrys[i])
{
arrys[++j] = arrys[i];
}
}
return ++j;
}
问题5:链表逆序
STU *link_reversed_order(STU *head)
{
STU *pf = NULL, *pb = NULL, *tmp = NULL;
pf = head; //将头节点的地址赋值给pf
if(head == NULL) {
printf("链表为空,不需要逆序!\n");
return head;
} else if(head->next == NULL) {
printf("链表只有一个节点,不需要逆序!\n");
return head;
} else {
pb = pf->next; //pb指向pf的下一个节点
head->next = NULL; //头节点的指针域置空(变为尾节点)
while(pb != NULL)
{
tmp = pb; //将pb的地址赋值给temp
pb = pb->next; //pb指向下一个节点
tmp->next = pf; //pb的上一个节点的指针域指向pf
pf = tmp; //让pf指向tmp
}
head = pf;
return head;
}
}